2013-06-21 79 views
2

我試圖獲取文件的列名並以迭代方式打印它們。我想問題是與print $i,但我不知道如何糾正它。我試過的代碼是:bash打印第一列至第n列迭代

#! /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 

但輸出我得到的是黑屏。

+0

不要設置在循環變量,刪除echo語句。這應該就夠了。 – devnull

+0

需要設置命令,因爲命令的輸出是從右側傳遞的。我曾嘗試在循環外設置變量。我得到錯誤。 – Vignesh

回答

4

你最好只是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次,而你不需要一個外部進程。

希望這有助於!

+0

我希望它特別循環,因爲我將在腳本中進一步使用值進行分析。這就是我想要它循環的原因。 – Vignesh

+0

@Vignesh沒有問題,相應地編輯帖子。 –

+0

謝謝,但這並沒有打印出任何值。 – Vignesh

1

您可以用awk本身打印:

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

你的代碼的主要問題是你的賦值語法是錯誤的。更改此:

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

這樣:

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

即:

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

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

+0

我試過更正,但我得到這個錯誤:未找到命令。 做:找不到命令。 非法變量名稱。 – Vignesh

+0

@ Vignesh:顯然你沒有在Bash中運行你的腳本? – ruakh

0

這是另一種選擇;不見得比任何其他人更好或更壞:

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

somthin像

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