同様のレイアウトの何千もの文字列を含む.txt文書があり、一部の行には望ましくない追加情報が含まれています。
例は次のとおりです。
202212_08,ABC123/A1234,AB,,C123
202212_08,CDEF1233/A5678,FG,,C345
出力が次のようになります。
20221208,ABC123,C123
20221208,CDEF1233,C344
正規表現を試しましたが、エラーが発生し続け、出力が空です。ご協力ありがとうございます。
答え1
そしてsed
:
$ sed -e 's:/.*,:,:' input.txt
202212_08,ABC123,C123
202212_08,CDEF1233,C345
これにより、/
行の最初の文字から行の最後の文字まで、,
すべての内容が単一の文字に置き換えられます,
。
ただし、入力データに複数のフィールドが含まれている場合は、通常、awkまたはperlを使用することをお勧めします。各フィールドを個別に操作および/または印刷できるためです。
たとえば、次のawkスクリプトは組み込み関数を使用して/.*
各入力行から2番目のフィールドを削除し、最初の()、2番目()、および最後の()フィールドを印刷します。sub()
$1
$2
$NF
$ awk -F, -vOFS=, '{sub(/\/.*/,"",$2); print $1, $2, $NF}' input.txt
202212_08,ABC123,C123
202212_08,CDEF1233,C345
またはパールを使用してください:
$ perl -F, -lane '$F[1] =~ s:/.*::; print join(",",@F[0,1,-1])' input.txt
202212_08,ABC123,C123
202212_08,CDEF1233,C345
この-F,
オプションはフィールド区切り文字(awkに似ています)を設定します。この-a
オプションを使用すると、入力は自動的に名前付き配列に分割されます@F
。 Perlの行末の自動処理(改行文字など)を-l
有効にし、Perlがそのように機能するようにします。 Perlに、次の引数が実行されるスクリプトであることを伝えます。\n
-n
sed -n
-e
$F[1]
Perl配列の索引付けは、配列の2番目の要素と同様に、1ではなく0から始まり、配列@F
スライスは@F[0,1,-1]
配列の最初、2番目、および最後の要素です。