UNIX命令添加逗号和空格

UNIX命令添加逗号和空格

我有一个看起来像这样的文件

$ cat IP
10.3.1.1
10.4.1.1
10.6.3.1
10.19.4.2
10.22.3.4

我如何让它看起来像:

$ cat IP 
10.3.1.1, 10.4.1.1, 10.6.3.1, 10.19.4.2, 10.22.3.4

答案1

perl

perl -pe 's/\n/, / unless eof' IP

添加-i编辑文件inplace.txt 的选项。或者-i.orig就地编辑它但保留原始内容为IP.orig.

使用zshshell,您还可以使用以下命令将这些 IP 加载到数组中:

ips=( ${(f)"$(<IP)"} )

然后j用逗号写回:

print -r -- ${(j[, ])ips} > IP

与一次处理一行的 perl 相反,perl 将整个文件加载到内存中。

另外两个区别:

  • 空行被丢弃
  • 即使原始文件不包含任何空文件或最后一行未正确分隔的文件,也始终在末尾添加换行符。

答案2

通过 GNU 实现sed

sed -z 's/\n*$//;s/\n/, /g;s/$/\n/' IP

答案3

也许

perl -e 'print join(", ", map { chomp; $_ } <>), "\n"' IP

或者

awk '{ printf "%s%s", c, $0; c = ", " } END { print "" }' IP

或者进行快速而肮脏的黑客攻击,受到文件行数的限制(可能只有 8000 行),并记住这xargs并不是真正为此设计的

xargs <IP | sed 's/ /, /g'

所有这些都会从示例数据集中产生相同的输出:

10.3.1.1, 10.4.1.1, 10.6.3.1, 10.19.4.2, 10.22.3.4

然后,您可以将该输出重定向到临时文件,然后覆盖原始文件。在这里,替换command_from_above为您选择的将更改写入的任何命令(在此答案或其他任何人的此处)标准输出而不是原始文件:

command_from_above >"IP.$$.tmp" && mv -f -- "IP.$$.tmp" IP
rm -f -- "IP.$$.tmp"

答案4

使用 awk:

awk '{printf "%s%s", (NR==1) ? "" : ", ", $0}END{print ""}'

这将为除第一行之外的每一行添加逗号前缀。

相关内容