AWK を使用して、最後の n 文字で部分文字列を新しい列に分割します。

AWK を使用して、最後の n 文字で部分文字列を新しい列に分割します。

大きなファイルがあり、.csv特定の列を文字列の長さに分割する必要があります。 2列の最後の6文字を取得して新しい列に移動しようとします。

現在の:

3102017,90131112,0,740
3022017,8903944,90,0
3092017,127037191,475,0

予想される:

3102017,90,131112,0,740
3022017,8,903944,90,0
3092017,127,037191,475,0

答え1

POSIX互換awk:

awk -F, -v OFS=, '{sub(/.{6}$/, OFS "&", $2); print}'

POSIX互換sed:

sed 's/^\([^,]*,[^,]*\)\([^,]\{6\}\)/\1,\2/'

2番目のフィールドの長さが6文字以上の場合にのみ行を変更します(2番目のフィールドを空白のままにする111,123456,333ことに注意してください)。111,,123456,333

答え2

KISSの方法は次のとおりですawk

$ awk -F, '{l=length($2); if (l>6) {$2=substr($2,1,l-6) OFS substr($2,l-5)}} 1' OFS=, file
3102017,90,131112,0,740
3022017,8,903944,90,0
3092017,127,037191,475,0

答え3

sed拡張正規表現の実装をサポートすることによって、すべての行の2番目の列には少なくとも6文字があると想定されます。

$ sed -E 's/,([^,]*)([^,]{6}),/,\1,\2,/' ip.csv 
3102017,90,131112,0,740
3022017,8,903944,90,0
3092017,127,037191,475,0
  • -E拡張正規表現では、いくつかの実装を-r次のように変更する必要があります。
  • ,([^,]*)([^,]{6}),,2番目の列と一致し、,
    • 2列は2つのグループに分けられ、最後の6文字はグループ2に属します。
  • ,\1,\2,必要に応じて交換

答え4

perl -pe 's/(,.*?,)/$1 =~ s!......,!,$&!r /e'  x.csv
  • 2番目のフィールド(,.*?,)を次に置き換えます。
  • =~ s! ...!...!r最後の6桁()は......()とaの結果に置き換えられます。,

関連情報