使用awk行到列和列到行

use*_*699 12 awk

我有两个文件包含如下

cat file1.txt
a b c 
1 2 3

cat file2.txt
a
b
c
1
2
3
Run Code Online (Sandbox Code Playgroud)

我想将file1安排为

a
b
c
1
2
3
Run Code Online (Sandbox Code Playgroud)

和file2安排为

a b c
1 2 3
Run Code Online (Sandbox Code Playgroud)

我想用awk一行解决方案

Chr*_*our 12

我用xargs它:

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

$ xargs -n3 < file2
a b c
1 2 3
Run Code Online (Sandbox Code Playgroud)

  • 我很喜欢这个解决方案.但是正在寻找一个awk解决方案. (2认同)

Jot*_*tne 8

一些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
Run Code Online (Sandbox Code Playgroud)


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

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

  • @jotne不要忘记将格式与数据分开的逗号.使用`FS`和`RS`更清楚并切换顺序保存显式比较`awk'{printf"%s%s",$ 0,(NR%3?FS:RS)}'`. (2认同)

Ed *_*ton 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
Run Code Online (Sandbox Code Playgroud)