如何从文件中删除重复的标题,除了在Linux

时间:2017-07-13 13:35:51

标签: linux bash scripting

我有一个如下文件。

文件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

请帮忙。

1 个答案:

答案 0 :(得分:3)

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

(或)以下使用$0来自Sundeep评论的可读版本,意思是整行内容

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

OP的后续问题,以便将文件保存到位,

最新版本的GNU Awk(自4.1.0 released起),可以选择"inplace" file editing

  

[...]&#34; inplace&#34;使用新工具构建的扩展可用于模拟GNU&#34; sed -i&#34;特征。 [...]

使用示例:

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