awkまたはsedを使用して同じフィールドがある場合、連続レコードを削除する方法は?

awkまたはsedを使用して同じフィールドがある場合、連続レコードを削除する方法は?

こんにちは、同じ番号を含む行を削除したいと思います。 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合計が同じ数のペアを削除します。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

関連情報