如果该行的值与下一行不同,是否有命令在文本文件中添加新行?

如果该行的值与下一行不同,是否有命令在文本文件中添加新行?

我有一个使用 sort -n 排序的文件。但是,为了在 gnuplot 中绘制曲面图,我需要在第一列具有不同值的行之间有一个空行。例如

1.0
1.0
1.1
1.1

到:

1.0
1.0

1.1
1.1

有什么办法可以使用 Ubuntu Linux 轻松地做到这一点吗?

答案1

我会这样写:

awk 'NR > 1 && $0 != last {print ""}
     {print; last = $0}' < your-file

请注意,只要行由数字组成,那$0 != last就是数字比较,与or 或or1.0相同(尽管不一定是 0x1,并且还要注意区域设置对小数分隔符处理的潜在影响(1.0 与 1,0))。如果您想确保词法比较,请将其更改为 .11e01.00$0 "" != last

根据awk实现的不同,这将强制执行memcmp()(字节到字节比较)、strcmp()(相同,但不能处理 NUL 字节)、strcoll()(两个字符串排序是否相同)或wcsncmp()(字符到字符,而不是字节到字节)比较(如果您的输入仅包含十进制数字和句点字符,则所有这些都应该是等效的)。

如果要强制进行字节到字节比较,请将语言环境固定为 C:

LC_ALL=C awk 'NR > 1 && $0 "" != last {print ""}
              {print; last = $0}' < your-file

(同样,某些awk实现会因 NUL 字符而阻塞)。

答案2

类似的东西可以完成这项工作:

awk 'BEGIN {A=""} {if ($0!=A) { printf "\n%s\n", $0; A=$0} else print $0}'

选择 A 的初始化值时要小心,不要在现有值中

相关内容