パイプで区切られた複数のフィールドを含む多くのファイルがあります。
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文字に切り捨て、すべてのフィールド(更新されたフィールドを含む)を印刷します。
答え2
ファイルの幅が固定されているか、少なくともそうであるため、sedで保持して削除する列数を数えることができます。
sed -r 's/(.{68}).{23}(.*)/\1\2/' yourfile