こんにちは、同じ番号を含む行を削除したいと思います。 awk、sed、またはperlでどのようにこれを達成できますか?たとえば、行4と5には両方とも12.7が含まれているので、これら2つの行を削除したいと思います。ありがとうございます。
入力サンプル
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