次の形式のcsvファイルがあります。
1,123-456,IND,91,UAE,97,USA,01,SA,27
3,345-678,AUS,61,SLA,94,NZW,64,RS,7
AWKコマンドを使用してこれを達成する方法については、以下に説明するように、パターンチェック,(\w{3}),(\d{2}),
と区切り文字に一致を表示する回数に基づいてチェックする必要があります。|
期待される出力
1,123-456,IND,91|UAE,97|USA,01
3,345-678,AUS,61|SLA,94|NZW,64
答え1
あなたがそう言うとき、数字と下線も一致するので、実際に文字だけが欲しいように見えるという\w+
意味だと仮定します。実際、あなたの例によると、おそらく大文字だけが必要です。最後にもう一度推測してみたら説明をしないでくださってアルファベット文字列が正確に3文字でない場合は除外したいようです。もしそうなら、Perlで好きなことをする方法は次のとおりです。[a-zA-Z]
\w
$ perl -lne '/^(.*?),[A-Z]{3},\d{2},/; $start=$1; @k=(/,(\w{3},\d{2})/g); print "$start,", join("|",@k)' file
1,123-456,IND,91|UAE,97|USA,01
3,345-678,AUS,61|SLA,94|NZW,64
または、2番目のフィールドの後にのみ一致させたい場合は、awkでこれを実行できます。
$ awk -F, -v OFS="," '{
for(i=3;i<=NF;i+=2){
if ($i~/^[A-Z]{3}$/ && $(i+1)~/^[0-9]{2}$/){
k ? k=k"|"$i","$(i+1) : k=$i","$(i+1);
}
} print $1,$2,k; k=""}' file
1,123-456,IND,91|UAE,97|USA,01
3,345-678,AUS,61|SLA,94|NZW,64