2013-11-03 32 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