大きなファイルがあり、.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の結果に置き換えられます。,