我有两个文件包含如下
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 单行的解决方案
我有两个文件包含如下
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 单行的解决方案
我会用xargs
这个:
$ xargs -n1 < file1
a
b
c
1
2
3
$ xargs -n3 < file2
a b c
1 2 3
一些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"
# 打印参数 #1 ($1)
NR%3==0?"RS:FS
# 添加额外的格式。测试行是否为第 3 行。如果不是,则使用 FS(空格),如果是,则使用 RS,新行。
所以这会在每 3 行之后调整下一个参数。
在打印之前将 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
这个答案详细说明了 Ed Morton 的简洁答案。他过去拒绝了我对他的答案的编辑,所以我将其作为单独的答案发布。
将 OFS 或 ORS 设置为 FS 或 RS 的值应该适用于任何 awk。这些变量在 awk 中有特殊的含义。
请注意,quirky { instruction }1
结构等价于,{ instruction } { print }
因为 awk 语言的基本结构是
expression { instructions }
more_expressions { more instructions }
因此,{}1 构造大致意味着:
«implicit true» { code }«1 -> true» «{default instruction -> print}»
输入:
$ cat file1
a b c
1 2 3
$ cat file2
a
b
c
1
2
3
对于第一种情况,我们必须重新分配记录以使 awk 重新计算要输出的字段数。
$ awk '{OFS=RS;$1=$1}1' file1
a
b
c
1
2
3
GNU awk 手册包含一些关于为什么可能需要重新分配字段的提示(重新分配 OFS、ORS 等的通常位置是在处理任何输入之前的 BEGIN 规则中)。奇怪的是,这给出了相同的结果,而无需重新分配字段。我想有不止一种方法可以让 awk 重新评估字段:
$ awk '{OFS=RS} { print $1, $2, $3 }' file1
a
b
c
1
2
3
第二种情况:
$ awk '{ ORS = (NR % 3 ? FS : RS) }1' file2
a b c
1 2 3
对于您的第一个文件,您可以尝试以下操作:
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 行需要在输出中跳过一行。我认为我们需要更多细节......