私が解決している問題は、「|」で区切られたフィールドを含むファイルがあり、ファイルがこれらのフィールドの1つに基づいてソートされることです。私が思いついたのは、特定の分野の範囲に基づいて線をつかむ方法です。
一例:
入力例は次のようになり、2番目のフィールドに基づいてソートされます。だから金田順にリストされています。
1234|abcd|3fgbe32
1234|abce|5fasdf3
5678|abcf|t438fjd
9876|abcg|57fshde
私が取得したい範囲は、「abcd - abcfの範囲内のすべてのレコードを別のファイルに記録したいと思います。残りのレコードは次のようになります。
1234|abcd|3fgbe32
1234|abce|5fasdf33
5678|abcf|t438fjd
初めて始めたとき、私はこの問題に間違った方法でアプローチしていると思いました。各行を繰り返しながら、正規表現と比較して行を調べて、その行が必要かどうかを確認します。しかし、awkとgrepを使用するより良い方法はありますか?
答え1
範囲内に属するすべてのレコードABCD-ABCF
シンプルアッ解決策:
awk -F'|' '$2~/^abc[d-f]$/' file
出力:
1234|abcd|3fgbe32
1234|abce|5fasdf3
5678|abcf|t438fjd
答え2
その他アッ解決策:
awk -F'|' '{if ($2 == "abcd") { l=1} else if ($2 == "abcg") { l=0} }l' file
答え3
ㅏsed解決策。
範囲の最初の行の前の行を削除するには、次の手順に従ってください。
cat file | sed '/abcd/Q'
範囲の最後の行の後の行を削除するには、次の手順に従ってください。
cat file | sed -n '/abcf/,$p'
-n : don't print non-matches
,$ : first match to end of file
p : print
一緒に置く:
cat file | sed '/abcd/Q | sed -n '/abcf/,$p'
これらのパターンは行のすべてのフィールドと一致するため、2番目のフィールドにのみ一致するより良いパターンが必要です。
cat file | sed -r -n '/^[^\|]+\|abcd/,$p' | sed -r '/^[^\|]+\|abce/Q'
sedを使用する非常に単純な範囲は次のとおりです。
cat file | sed -n '/abc[def]/p'
答え4
sed
からの範囲を名前付きファイルabcd
に書き込み、残りの行はstdoutに渡すオールインワンソリューションです。したがって、ファイルを2回確認する必要はありません。abcf
other
sed -e '/|abcd|/,/|abcf|/{wother' -e 'd;}'