使用awk行到列和列到行

时间:2013-11-03 11:54:27

标签: 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 one line解决方案

4 个答案:

答案 0 :(得分:10)

我会使用xargs

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

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

答案 1 :(得分:6)

一些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"#print pararameter#1($ 1)
NR%3==0?"RS:FS#添加额外的格式。测试行是否为数字3.如果不是,则使用FS(空格),如果是使用RS,则使用新行 所以这会在每3行之后调整下一个参数。

答案 2 :(得分:5)

在打印之前简单地将OFS或ORS设置为FS或RS的惯用awk方法(并在必要时使用$1=$1重新编译记录)将适用于任何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

答案 3 :(得分:0)

对于你的第一个文件,你可以尝试类似:

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行需要跳过输出中的一行。我认为我们需要更多细节......

相关问题