入力する:
1,2,20,11
1,1,2018,111
出力:
1,02,20,11
1,01,18,111
0
単一の数字の場合は、フィールド2(月)に挿入したいと思います。
4桁の場合は、フィールド3(年)から最初の2桁を削除しようとします。
答え1
使用 awk
:
awk -F, -v OFS=, ' { $2 = sprintf("%02d", $2) }
length($3) == 4 { sub("^[0-9][0-9]", "", $3) } 1' file
これは、無条件に2番目のカンマ区切りフィールドをゼロで埋められた2桁の整数に再フォーマットします。 3番目のフィールドの長さが4文字の場合、最初の2桁は削除されます。次に、結果の履歴を印刷します。
答え2
使用awk
:
awk -F, '{ printf("%d,%02d,%d\n" ,$1, $2, substr($3, length($3)-1) ) }' infile
length($3)
戻り長さ-1
の作成に使用された列3の長さを返します。substr($3, START[, LEN])
ロンドン最後の2番目の数字の位置から始まる文字は次のとおりです。スタート(今ですlength($3)-1
)。オプションの場合ロンドン残りは省略スタート使用される。
編集する修正された質問の場合(今4つの列があります。):
awk -F, '{
printf("%d,%02d,%d%s\n" ,$1, $2, substr($3, length($3)-1), ($4?","$4:"") )
}' OFS= infile
一般的なケースでは、N個の列(少なくとも3):
awk -F, '{
printf("%d,%02d,%d" ,$1, $2, substr($3, length($3)-1) ) }
{ $1=$2=$3=""; printf ("%s\n", (NF>3?","$0:"") ) }' OFS= infile
答え3
input file
1,2,20,11
1,1,2018,111
注文する
awk -F ',' '{if(length($2)==1)$2="0"$2;print $0}' inputfile | awk '{if(length($3)==4)$3=substr($3,3,2);print $0}'| sed 's/ /,/g'
出力
1,02,20,11
1,01,18,111
答え4
この状況を処理する1つの方法は次のとおりです。
注文する
perl -pe 's|^\d+,\K(\d)?(\d),(\d\d)(\d\d)?(?=,)|($1//0)."$2,".($4//$3)|e' input.txt
出力
1,02,20,11
1,01,18,111
説明する:
s|
^\d+,\K(?# は左側の最初のカンマ区切りフィールドを保持します)(?# $1 $2) (\d)?(\d), (?# は数字の後に明確な数字が続くことがあります)
(?# $3 $4) (\d\d)(\d\d)? (?#2つの数字の後に2つの数字がある可能性があります)
(?=、)(?#の右側にカンマが表示されます)
|($1//0)."$2,".($4//$3)|e
($ 1 // 0)は、$ 1が定義されていない場合は0を使用することを意味します。 IOW、フィールド2は1桁です。 ($ 4 // $ 3)は、$ 4が定義されていない場合は$ 3を使用し、IOWのビット数に基づいて2つのタプルのうちの1つを選択することを意味します。
s //コマンドの/ eフラグはRHSをPerlコードとして扱い、提供された引数を使用してそれを評価し、この評価結果をs //コマンドのRHSとして使用する必要があります。