特定のフィールドを切り取り、Unixシェルスクリプトで置き換える

特定のフィールドを切り取り、Unixシェルスクリプトで置き換える

次のデータを含むファイルがあります。

5773|2015-11-19|2016418|O|2015-11-06|C|AB1CD|826|826|CDE|2015-11-19|22222222222222222222222222222|ABCD|AB|30
5773|2015-11-19|2016418|O|2015-11-06|C|AB1CD|826|826|CDE|2015-11-19|88888888888888888888888888888|ABCD|AB|30
5773|2015-11-19|2016418|O|2015-11-06|C|AB1CD|826|826|CDE|2015-11-19|22222222222222222222222222222|ABCD|AB|30
5773|2015-11-19|2016418|O|2015-11-06|C|AB1CD|826|826|CDE|2015-11-19|55555555555555555555555555555|ABCD|AB|30

|データはコントロールA文字で区切られていますが、コントロールAを使用してデータを公開できないため、これを置き換えました。

値を切り捨てて22222222222222222222222222222最初の5つの値が必要なので、最終出力データは次のようになります。

5773|2015-11-19|2016418|O|2015-11-06|C|AB1CD|826|826|CDE|2015-11-19|22222|ABCD|AB|30
5773|2015-11-19|2016418|O|2015-11-06|C|AB1CD|826|826|CDE|2015-11-19|88888|ABCD|AB|30
5773|2015-11-19|2016418|O|2015-11-06|C|AB1CD|826|826|CDE|2015-11-19|22222|ABCD|AB|30
5773|2015-11-19|2016418|O|2015-11-06|C|AB1CD|826|826|CDE|2015-11-19|55555|ABCD|AB|30

これについての助けを探しています。

ベストアンサー1

awk次のことができます。

awk -F\| 'BEGIN {OFS="|"};{$12=substr($12,1,5)};1' 

-Fフィールド区切り記号をに設定して|からテキスト処理を開始する前に、このBEGINブロックを使用して出力フィールド区切り記号(OFS)をに設定します。|次に、各レコードの12番目のフィールド値をそのフィールドの最初の5文字に置き換えます。

コマンドラインで必要に応じて異なる引数で処理するファイル名を指定するか、更新するファイルを生成するプロセスがある場合はパイプで使用できます。

私が経験したいくつかの問題を解決し、さらにPOSIXスタイルにしたStéphane Chazelasに感謝します。特に、開始インデックスを0から1に変更します。 GNU ドキュメントには次の行が含まれているため、このエラーは発生しません。

startが1より小さい場合、substr()はそれを1として扱います。

ただし、1これは最初の文字のインデックスであるため、特にそうでない人に使用する必要がありますgawk。例えばmawk:

$ mawk 'BEGIN{print substr("1234567", 0, 5)}'
1234
$ mawk 'BEGIN{print substr("1234567", 1, 5)}'
12345

おすすめ記事