2013-01-15 59 views
0

我有一個小問題,我希望能幫助我。awk讀取文件的特定列

總之,我有一個文件:

1,5,6,7,8,9 

2,3,8,5,35,3 

2,46,76,98,9 

我需要從中讀取特定行,並將它們打印到另一個文本文檔。我知道我可以使用(awk '{print "$2" "$3"}')打印彼此相鄰的第二列和第三列。但是,我需要使用兩條語句(awk '{print "$2"}' >> file.text),然後是(awk '{print "$3"}' >> file.text),但這兩列會出現在對方下方,而不是彼此相鄰。

我該如何讓它們出現在彼此旁邊?

+0

爲什麼你需要使用兩個語句? – Thor

+0

我不知道爲什麼你使用awk'{print'$ 2「}'>> file.text而不是awk'{print $ 2,$ 3}'>> file.text – Vijay

+1

不要引用字段引用:'awk'{print 「$ 2」}''會給你字符'$'和'2',而不是第二列的值 –

回答

3

如果您需要必須提取不同進程中的列,請使用paste將它們縫合在一起。我假設你的shell是bash/zsh/ksh,並且我假設你的示例輸入中的空行不應該在那裏。

paste -d, <(awk -F, '{print $2}' file) <(awk -F, '{print $3}' file) 

產生

5,6 
3,8 
46,76 

沒有過程換人:根據您的回答

awk -F, '{print $2}' file > tmp1 
awk -F, '{print $3}' file > tmp2 
paste -d, tmp1 tmp2 > output 

更新:

第一次出現,這是一個令人困惑的設置。這是否工作?

for ((x=1; x<=$number_of_features; x++)); do 
    feature_number=$(sed -n "$x {p;q}" feature.txt) 
    if [[ -f out.txt ]]; then 
     cut -d, -f$feature_number file.txt > out.txt 
    else 
     paste -d, out.txt <(cut -d, -f$feature_number file.txt) > tmp && 
     mv tmp out.txt 
    fi 
done 

必須多次讀取file.txt文件。只需要閱讀一次就顯得更有效率:

awk -F, -f numfeat=$number_of_features ' 
    # read the feature file into an array 
    NR==FNR { 
     colno[++i] = $0 
     next 
    } 

    # now, process the file.txt and emit the desired columns 
    { 
     sep = "" 
     for (i=1; i<=numfeat; i++) { 
      printf "%s%s", sep, $(colno[i]) 
      sep = FS 
     } 
     print "" 
    } 
' feature.txt file.txt > out.txt 
+0

感謝Glenn的快速響應! 我會盡力回覆你 乾杯 –

+0

你好格倫,你介意看下面請。謝謝! –

+0

尊敬的格倫專家。你令人驚歎。萬分感謝! –

-1

,而不是使用awks文件重定向,使用殼重定向例如

awk '{print $2,$3}' >> file 

逗號置換爲輸出字段分隔符(默認空間)的值。

0

謝謝大家的回答。我相信我的問題應該更清楚,對此抱歉。

我的代碼如下:

for ((x = 1; x <= $number_of_features ; x++)) # the number extracted from a text file 
do 
    feature_number=$(awk 'FNR == "'$x'" {print}' feature.txt) 
    awk -F, '{print $"'$feature_number'"}' file.txt >> out.txt 
done 

基本上,我提取特徵數目(其是相同的列號)從一個文本文檔,然後打印該列。該文本文件可能包含許多功能編號。

事情是,每次我有不同的功能號碼(這反映了列號)。所以,應用上述解決方案對於這個問題是不夠的。

我希望現在更清楚。

請等待您的意見。

感謝 艾哈邁德

+1

你應該用這些信息來編輯你的問題,而不是將其作爲答案。 –