我有一个如下文件。
文件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
请帮忙。
答案 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