如果使用 awk 或 sed 具有相同字段,如何删除连续记录?

如果使用 awk 或 sed 具有相同字段,如何删除连续记录?

你好,我想删除包含相同数字的行,如何在 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对。XY

$ 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

相关内容