特定のフィールドを切り取り、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

答え2

そしてawk

awk 'BEGIN{FS=OFS="\1"}; {$12=substr($12,1,5)}; 1' file
  • BEGIN{...}:処理が始まる前に実行
  • FS=OFS="\1":入力フィールドと出力フィールドの区切り記号をに設定します^A。 ~によるとウィクショナリー辞書 ^Aは「メッセージヘッダーの最初の文字」で、8進値はです1
  • {$12=substr($12,1,5)}:12番目のフィールドを切り取ります。
  • 1:記録(基本操作)を印刷します。

答え3

sed 's/\([^|]\{0,5\}\)[^|]*/\1/12' <in >out

...またはGNUまたはBSDを使用してくださいsed

sed -E 's/([^|]{0,5})[^|]*/\1/12' <in >out

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

とても簡単です。パイプ以外の文字列の入力行で、12番目の発生項目のうち最大5つだけを保持します。

関連情報