awk/sed を使用してフィールドを長さに切り捨てます。

awk/sed を使用してフィールドを長さに切り捨てます。

パイプで区切られた複数のフィールドを含む多くのファイルがあります。

5595340959340|1|MXPYAQWE|870569689456954654|0|0|20181018224126|1212121212121212121212121212|2|0|1000|70|33107||1|イベント 5595340959340|1|MXPYAQWE|870569689456954654|0|0|20181018224126|2323232323232323232323232323|2|0|1000|70|33107||1|イベント 5595340959340|1|MXPYAQWE|870569689456954654|0|0|20181018224126|3434343434343434343434343434|2|0|1000|70|33107||1|イベント 5595340959340|1|MXPYAQWE|870569689456954654|0|0|20181018224126|4545454545454545454545454545|2|0|1000|70|33107||1|イベント 5595340959340|1|MXPYAQWE|870569689456954654|0|0|20181018224126|5656565656565656565656565656|2|0|1000|70|33107||1|イベント

8番目のフィールドに注意してください。現在29文字なので、5文字に減らす必要があります。

私が思いついた唯一の(複雑な)解決策は次のとおりです。

トリミングしたいフィールドを分離します。

awk -F "|" '{print $8}' > Original_Fields

フィールドを切り取る

cp Original_Fields Temp
more Temp | cut -c -5 > Trimmed_Fields

sed を使用した代替スクリプトの作成

grep -rh -f <file_with_matching_strings> /path/to/files > Original_Strings
vi Original_Strings
:%s/^/grep -rl "/g
:%s/$/" \/path\/to\/file | xargs sed -i 's\//g
:wq!

次に、Original_FieldsファイルとTrimmed_Fieldsファイルを編集して、次のように作成します。

grep -rl /path/to/file | xargs sed -i 's/Original_Field/Trimmed_Field/g'

これはうまくいきますが、AWKとSEDを使用してこれを行うより速い方法が必要であれば、これらすべてを1つのステップで実行できると強く疑っています。

ベストアンサー1

はい、AWKを使用して各行を切り取り、書き換えることができます。

awk -F'|' 'BEGIN { OFS = FS } { $8 = substr($8, 1, 5); print }'

入力と出力の区切り文字を「|」に設定し、各入力行に対して8番目のフィールドを最大5文字に切り捨て、すべてのフィールド(更新されたフィールドを含む)を印刷します。

おすすめ記事