linux - 如何从文件中删除重复的 header (Linux 中第一次出现除外)

标签 linux bash awk

我有一个如下所示的文件。

文件1:

No name city country
1  xyz yyyy zzz
No name city country
2 test dddd xxxx
No name city country
3  xyz yyyy zzz

我想从此文件中删除除第一次出现之外的重复行,并将结果保存在同一个文件中。

我尝试了下面的代码,但没有帮助。

header=$(head -n 1 file1)
(printf "%s\n" "$header";
 grep -vFxe "$header" file1
) > file1

最佳答案

Awk中非常简单,只需将行中的所有字段作为唯一键即可,

awk '!unique[$1$2$3$4]++' file > new-file

产生的输出为

No name city country
1  xyz yyyy zzz
2 test dddd xxxx
3  xyz yyyy zzz

Awk 中的一个更易读的版本是由循环到行中的最大字段(循环到 NF)组成

awk '{key=""; for(i=1;i<=NF;i++) key=key$i;}!unique[key]++' file > new-file

(或)下面 Sundeep 评论中的易读版本,使用 $0 表示整行内容

awk '!unique[$0]++' file

OP 提出的关于就地保存文件的后续问题,

GNU Awk 的最新版本(自 4.1.0 released 开始),具有 "inplace" file editing 选项:

[...] The "inplace" extension, built using the new facility, can be used to simulate the GNU "sed -i" feature. [...]

使用示例:

gawk -i inplace '{key=""; for(i=1;i<=NF;i++) key=key$i;}!unique[key]++' file

保留备份:

gawk -i inplace -v INPLACE_SUFFIX=.bak '{key=""; for(i=1;i<=NF;i++) key=key$i;}!unique[key]++' file

(或者)如果您的 Awk 不支持,请使用 shell 内置函数

tmp=$(mktemp) 
awk '{key=""; for(i=1;i<=NF;i++) key=key$i;}!unique[key]++' file > "$tmp" && mv "$tmp" file 

关于linux - 如何从文件中删除重复的 header (Linux 中第一次出现除外),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45082275/

相关文章:

linux - 如何成功使用 RDAP 协议(protocol)代替 whois

c - 为什么 gcc 在其所有错误消息中都有 "â"?

bash - 重定向 stderr 会更改管道命令的退出代码

linux - Unix - 创建文件夹和文件的路径

linux - 按列将大型 CSV 拆分为多个文件

linux - 通过搜索另一个文件从文件中删除匹配段落

c++ - 无法在 Centos 7 上构建 32 位库

c - SDL makefile 缺少分隔符

bash - Slurm 内联 sbatch 命令提交

regex - 使用 AWK 打印由正则表达式定界符分隔的字符串中的字段时结果不明确