簡體   English   中英

bash反復打印一行中的第一到第n列

[英]bash print first to nth column in a line iteratively

我正在嘗試獲取文件的列名並迭代地打印它們。 我猜問題出在print $i但我不知道如何糾正它。 我試過的代碼是:

#! /bin/bash
for i in {2..5}
do
  set snp = head -n 1 smaller.txt | awk '{print $i}'
  echo $snp
done

輸入文件示例:

ID Name Age Sex State Ext
1  A    12   M    UT  811
2  B    12   F    UT  818

所需的輸出:

Name 
Age
Sex 
State
Ext

但是我得到的輸出是黑屏。

您最好只read文件的第一行並將結果存儲為數組:

read -a header < smaller.txt

然后printf相關字段:

printf "%s\n" "${header[@]:1}"

而且,這僅使用 ,並且不涉及不必要的循環。

編輯。 為了也回答您的評論,您將能夠遍歷標題字段,從而:

read -a header < smaller.txt
for snp in "${header[@]:1}"; do
    echo "$snp"
done

編輯2。您的原始方法有很多錯誤。 這是它的更正版本(盡管我之前寫的是解決問題的更可取的方法):

for i in {2..5}; do
    snp=$(head -n 1 smaller.txt | awk "{print \$$i}")
    echo "$snp"
done
  • set可能無法執行您認為的操作。
  • 由於awk '{print $i}'中的單引號導致$i永遠不會被擴展。
  • 該算法不好,因為您要調用headawk 4次,而您不需要單個外部進程。

希望這可以幫助!

您可以使用awk本身進行打印:

awk 'NR==1{for (i=2; i<=5; i++) print $i}' smaller.txt

代碼的主要問題是分配語法錯誤。 更改此:

set snp = head -n 1 smaller.txt | awk '{print $i}'

對此:

snp=$(head -n 1 smaller.txt | awk '{print $i}')

那是:

  • 不要使用set set用於設置外殼程序選項,編號參數等,而不用於分配任意變量。
  • 刪除=周圍的空格。
  • 要運行命令並將其輸出捕獲為字符串,請使用$(...) (或`...` ,但是$(...)不太容易出錯)。

也就是說,我同意gniourf_gniourf的方法。

這是另一種選擇。 不一定比其他任何一個更好或更糟:

for n in $(head smaller.txt)
do
  echo ${n}
done

somthin喜歡

  for x1 in $(head -n1 smaller.txt );do 
      echo $x1
  done

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM