2017-02-26 44 views
-1

我有一個包含我需要在下面的表格中提取信息的文本文件:獲取列1和3使用awk,並將它們合併成一個

code1 something1 code2 something2 code3 something3 
code4 something4 code5 something5 code6 something6 
... 

而且我想提取到兩個單獨的文件形式:

code1 
code2 
code3 
code4 
... 

和:

something1 
something2 
something3 
something4 
... 

注意,它們必須是有序的。例如使用cat mydocument | awk '{print $1 $3}'輸出

code1code2 
code4code5 
... 
+0

你確定嗎?我認爲它應該輸出code1 code2;代碼3代碼4; ... – giuseppe

+0

@giuseppe真實,更正。 – D1X

+2

將「code」和「something」作爲示例輸入/輸出的示例,而不僅僅是那些單詞,或者您最終可能會得到一個解決方案,該解決方案僅適用於字面上包含「code」和「something」的輸入或其他對於您的真實數據,方法並不是一個好的(或功能性的)解決方案。你的輸入文件在每條數據線之間是否真的有空行?如果不是,請解決您的問題,以更真實地代表您的真實數據。 –

回答

0

您可以在單獨的行使用print多次輸出所有相關領域:

awk '{print $1; print $3; print $5}' input_file > fields1_3_and_5 
awk '{print $2; print $4; print $6}' input_file > fields2_4_and_6 

如果空行出現在你的輸入文件爲您的文章似乎表明,你可以檢查字段的數量,以避免讓他們在你的輸出文件:

awk 'NF==6{print $1; print $3; print $5}' input_file > fields1_3_and_5 
awk 'NF==6{print $2; print $4; print $6}' input_file > fields2_4_and_6 
3

寫入列1,3,5,7等文件代碼.TXT等列2,4,6,8和something.txt文件:

awk '{for (i=1; i<=NF; i=i+2) print $i}' input.txt > code.txt 
awk '{for (i=2; i<=NF; i=i+2) print $i}' input.txt > something.txt 
0

如果這不是你所需要的,然後更新您的問題表現出一些更多的真正具有代表性的樣本輸入和預期的輸出。

輸入

$ cat f 
code1 something1 code2 something2 code3 something3 

code4 something4 code5 something5 code6 something6 

輸出

$ awk 'NF{for(i=1; i<=NF; i++)print $i >(i%2?"code.txt":"something.txt")}' f 

$ cat code.txt 
code1 
code2 
code3 
code4 
code5 
code6 

$ cat something.txt 
something1 
something2 
something3 
something4 
something5 
something6 
0

試試這個 -

awk '{for (i=1; i<=NF;i++) if(i%2!=0) {print $i > "code.txt"} else{print $i > "col.txt"}}' column.txt 

在這裏你可以看到兩者的輸出文件 -

paste code.txt col.txt 
code1 something1 
code2 something2 
code3 something3 
code4 something4 
code5 something5 
code6 something6 
0

@DIX:嘗試:還有一個不同的方法,沒有循環等,可以幫助你,我考慮到沒有空行有沒有在你的INPUT_FILE。

awk '{print > (NR%2==0?"even_file_output":"odd_file_output")}' RS='[ |\n]' Input_file 
0

您要求提供awk,其他解決方案也是可行的。

當所有的線路有一個甚至NR字段,你可以使用sed

sed 's/ *\([^ ]\+\) [^ ]\+/\1\n/g' input.txt > oddfields.txt 
sed 's/ *[^ ]\+ \([^ ]\+\)/\1\n/g' input.txt > evenfields.txt 
2

鑑於您已發佈的信息,到目前爲止,所有你需要做的是

grep -Eo "[^ ]+ [^ ]+" input.txt | cut -d" " -f1 > oddfields.txt 
grep -Eo "[^ ]+ [^ ]+" input.txt | cut -d" " -f2 > evenfields.txt 

或同樣的想法(與GNU awk多字符RS):

awk -v RS='[[:space:]]+' '{print > (NR%2?"foo":"bar")}' file 

如果這並非所有你需要然後編輯你的問題是清晰。

+1

謝謝你分享這個漂亮的命令(你的awk命令的FAN),雖然我的命令的邏輯與你類似,但老實說我沒有複製它:)(在發佈之前的幾分鐘內) – RavinderSingh13

+0

@Ed,根據這篇文章https://www.gnu.org/software/gawk/manual/html_node/Options.html#Options)使用-v與內置變量可能會導致令人驚訝的結果,所以我認爲'awk'BEGIN {RS =「[[ :space:]] + {} {print>(NR%2?「foo」:「bar」)}''可以使用 – Vicky

+0

@Vicky該文章警告awk在執行時設置的變量如NF和NR,不是那些從未像RS,ORS,FS和OFS那樣設置的人。在命令行中設置變量沒有任何問題。在使用'-v'時唯一需要注意的是它會解釋轉義序列,所以'\ t'將成爲一個字面製表符等,但這不適用於這種情況。 –

相關問題