你好,我想删除包含相同数字的行,如何在 awk 或 sed 或 perl 中实现这一点?例如,第 4 行和第 5 行都包含 12.7,因此我希望删除这两行。谢谢。
输入样本
start=0.1
end=2.5
start=8.7
end=12.7
start=12.7
end=16.7
start=16.7
end=25.2
start=25.2
end=48.7
start=48.7
end=60.1
start=66.2
end=69.2
start=69.2
end=72.2
start=72.2
end=75.2
start=75.2
end=78.2
预期输出:
start=0.1
end=2.5
start=8.7
end=60.1
start=66.2
end=78.2
答案1
使用 的 GNU 实现uniq
,并假设输入不包含制表符,您可以这样做:
<your-file tr = '\t' | uniq -uf1 | tr '\t' =
答案2
通过awk
双重解析文件并仅打印具有唯一最后一个字段的行。
$ awk -F= 'p==1{seen[$NF]++} p==2 && seen[$NF]==1' p=1 file p=2 file
start=0.1
end=2.5
start=8.7
end=60.1
start=66.2
end=78.2
或者相同,使用经典的awk
惯用语法(FNR==NR
代表“读取第一个文件时”,也是next
必要的)
awk -F= 'FNR==NR {seen[$NF]++; next} seen[$NF]==1' file file
答案3
忽略行号(我相信只是为了问题的读者而存在),您似乎基本上想要合并背靠背的范围,即删除和为相同数字的任何end=X
start=Y
对。X
Y
$ tr '\n' '\t' < file | sed 's/end=\([[:digit:].]*\)[[:blank:]]start=\1[[:blank:]]//g' | tr '\t' '\n'
start=0.1
end=2.5
start=8.7
end=60.1
start=66.2
end=78.2
首先用制表符替换输入数据中的每个换行符,然后用于sed
删除符号end=
start=
后具有相同数字的每一对=
。合并范围后,制表符将再次被换行符替换。
答案4
for i in `awk -F "=" '{if(!seen[$NF]++)print $NF}' file`; do p=`awk -F "=" -v i="$i" '$NF == i{print $0}' file|wc -l`;if [[ $p == 1 ]]; then awk -F "=" -v i="$i" '$NF == i{print $0}' file; fi; done
输出
start=0.1
end=2.5
start=8.7
end=60.1
start=66.2
end=78.2