我有两个文件,包含如下
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解决方案
答案 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行需要跳过输出中的一行。我认为我们需要更多细节......