アルファベット範囲に基づいて区切られたファイルから行を取得します。

アルファベット範囲に基づいて区切られたファイルから行を取得します。

私が解決している問題は、「|」で区切られたフィールドを含むファイルがあり、ファイルがこれらのフィールドの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回確認する必要はありません。abcfother

sed -e '/|abcd|/,/|abcf|/{wother' -e 'd;}'

関連情報