15

我有两个文件包含如下

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

5 回答 5

17

我会用xargs这个:

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

$ xargs -n3 < file2
a b c
1 2 3
于 2013-11-03T13:56:11.967 回答
9

一些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 行之后调整下一个参数。

于 2013-11-03T13:12:54.183 回答
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
于 2013-11-03T15:09:39.620 回答
1

这个答案详细说明了 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
于 2021-12-02T02:42:46.003 回答
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 行需要在输出中跳过一行。我认为我们需要更多细节......

于 2013-11-03T11:58:26.057 回答