2013-11-03 80 views
9

我有一個包含如下排列和列到行使用AWK

cat file1.txt 
a b c 
1 2 3 

cat file2.txt 
a 
b 
c 
1 
2 
3 

我想file1的被佈置爲

a 
b 
c 
1 
2 
3 

和file2到被佈置爲

a b c 
1 2 3 
兩個文件

我想用awk一行解決方案

回答

4

一些awk版本

awk 1 RS=" |\n" file1 # gnu awk version 
awk '{for (i=1;i<=NF;i++) print $i}' file1 # portable version 
a 
b 
c 
1 
2 
3 


awk '{printf "%s" (NR%3==0?"RS:FS),$1}' file2 
a b c 
1 2 3 

printf "%s"#打印pararameter#1($ 1)
NR%3==0?"RS:FS#添加額外的格式。測試行號是否3.如果不行,則使用FS(空格),如果使用RS,則換行。
所以這調整每3行後的下一個參數。

+0

作爲awk的新手,我無法完全理解file2的解決方案。將不勝感激,如果你能解釋它 – user2949699

+2

@jotne不要忘記格式與數據分開的逗號。使用'FS'和'RS'更清晰,並切換順序保存顯式比較'awk'{printf「%s%s」,$ 0,(NR%3?FS:RS)}''。 –

+0

@sudo_O是它的更清潔,沒有想過它。 &user2949699我爲你添加了一些額外的信息,希望它有助於一些。 – Jotne

0

對於YOUT第一個文件,你可以嘗試像:

awk '{for (i=1 ; i <= NF ; i++) print $i}' file1.txt 

爲了您的第二個文件,你可以嘗試像:

awk 'BEGIN {str=""; i=1} {if(i%3 == 0){str=str""$0"\n"} else {str=str""$0" "} i++} END {print str}' file2.txt 

不過,我會做出那樣的全一些假設例如,3行需要在輸出中跳過一行。我們需要更多的細節我想......

+1

您不需要'-F「」'因爲它的默認值。 – Jotne

+1

是的,我忘了,我會編輯我的帖子。謝謝:) –

9

我會使用xargs此:

$ xargs -n1 < file1 
a 
b 
c 
1 
2 
3 

$ xargs -n3 < file2 
a b c 
1 2 3 
+2

我喜歡這個解決方案,因爲它的簡單性。但是正在尋找awk解決方案。 – user2949699

+0

不錯的一個..我之前沒有看到 – ackuser

+0

真的很喜歡這個,我搜索了一段時間來得到這個解決方案,謝謝(+1) – Patric

6

的簡單設置的OFS或ORS的FS或RS適當打印之前(並重新編譯,如果有必要$1=$1備案)的慣用awk的方法將與任何awk一起工作:

$ cat file1 
a b c 
1 2 3 
$ awk '{OFS=RS;$1=$1}1' file1 
a 
b 
c 
1 
2 
3 
$ cat file2 
a 
b 
c 
1 
2 
3 
$ awk '{ORS=(NR%3?FS:RS)}1' file2 
a b c 
1 2 3