如何将多行输出合并为一行?

如何将多行输出合并为一行?

我想将不同的行输出合并到一行,如下所示。

$ cat new.txt | grep Full |  awk '{print $1}' 
09/01/2018
08/25/2018
08/18/2018
08/11/2018
08/04/2018
07/28/2018
07/21/2018

我想将上面的输出合并到一行,例如

09/01/2018,08/25/2018

ETC。

答案1

tr '\n' ',' | sed 's/,$/\n/'

tr将每个换行符替换为,,包括最后一个换行符(在 之后07/21/2018)。然后在末尾用换行符sed替换,以形成不带尾随 的 POSIX 兼容行。,,

请注意sed,文本处理工具默认每次只处理一行。留下的tr都是一行;它可能很长,具体取决于您的输入,并且sed可能不再是处理它的最佳工具。

我会重新考虑将所有结果放在一行中的想法,只是为了避免这种情况。有办法sed用处理字节(而不是行)的工具来代替这个。但即使你在这里这样做,你仍然会得到一行非常长的行,这不方便以后解析。

好的,如果您确实需要这样做,请使用以下命令创建任意大小的行。所有解析都是使用对字节进行操作的工具完成的:

head -c -1 | tr '\n' ',' && printf '\n'

head删除最后一个字符,我们盲目地认为它是一个换行符;tr将所有剩余的换行符更改为,字符;printf添加尾随换行符以使结果成为符合 POSIX 标准的行。

答案2

你要paste

cat new.txt | grep Full |  awk '{print $1}' | paste -s -d,

此外,awk 可以完成 cat 和 grep 可以完成的任务,因此

awk '/Full/ {print $1}' new.txt | paste -s -d,

此外,awk 可以格式化其输出,但可读性较差:

awk '/Full/ {printf "%s%s", (NR == 1 ? "" : ","), $1} END {print ""}' new.txt

相关内容