2012-12-28 287 views
5

這是另一個noob問題。我有這樣使用awk將每第二行移動到一個新列

 
John 
30 
Mike 
0.0786268 
Tyson 
0.114889 
Gabriel 
0.176072 
Fiona 
0.101895 

我需要每隔一行轉移到一個新的列,因此也應該是這樣的

 
John 30 
Mike 0.0786268 
Tyson 0.114889 
Gabriel 0.176072 
Fiona 0.101895 

我剛纔說awk 'NR%2==0'將打印中每隔一行的文件時,可能有人建議我如何將他們轉移到如上所述的新專欄。任何幫助最受讚賞。

+0

相關,但不是AWK具體:http://stackoverflow.com/questions/8522851/concise-and-portable-join-on-the-unix-command-line –

回答

1

一種方法是:

awk '{ printf("%-10s ",$0); if(NR%2==0) printf("\n");}' file 

See it

+0

謝謝你的一個襯墊,它真的很好。我剛剛開始學習awk,如果我可以再問你一些問題,我猜printf(「% - 10s」,$ 0)會打印每一行,但在此之後我無法理解。再次感謝。 – Amit

+0

'printf'不帶換行符,'%s'是字符串的格式規範。 '%-10s'將填充空格,長度爲10,左對齊或截斷較長的字符串。我實際上是'printf(「%s」,$ 0)',而不是%s之後的空格,或者製表符'\ t'。 – tripleee

+1

printf是一個內建函數,不是一個函數,所以()不會做你認爲他們做的事,尾隨的分號是超級的,而打印換行符的方式是「print」「'。 –

0

sed的是更好地做到這一點比AWK:

sed 'N;s/\n/ /g' yourfile 

也AWK:

awk '{if(NR%2!=0){p=""}else{p="\n"};printf $0" "p}' your_file 

還要檢查其他解here

+0

謝謝你的工作就像一個魅力 – Amit

+2

sed是不是比awk更好地做到這一點,因爲它甚至不接近你如何在awk中做到這一點。 –

1

我會嘗試使用sed這樣的:

sed 'N;s/\n/ /' file 

然而,這不會很好地格式化您的數據。你可以將它變成column -t

< file sed 'N;s/\n/ /' | column -t 

但是這似乎沒有必要。這將是更好地使用paste這樣的:

paste - - < file 

結果:

John 30 
Mike 0.0786268 
Tyson 0.114889 
Gabriel 0.176072 
Fiona 0.101895 
+0

謝謝,不知道可以用粘貼完成 – Amit

3

xargs的能做到這一點,在命令行是非常短的:

xargs -n2 < file 
0
awk 'NR%2{s=$0; next} {print s, $0}' file 

,或者使用default action

awk 'NR%2{s=$0; next} {$0=s" "$0}1' file 
0
paste - - <file> newfile 

粘貼默認使用標籤作爲分隔符。

6
awk '{printf "%s%s",$0,(NR%2?FS:RS)}' file 
+1

這是AWK最優秀最優雅的插圖。沒有其他解決方案接近。 –

+0

該解決方案依賴於FS和RS的默認值,分別是空格和換行符。 – Tom

+1

+1這真是太棒了。 –

相關問題