長さが等しい場合、awk は列値を増分値に置き換えます。

長さが等しい場合、awk は列値を増分値に置き換えます。

非標準データがありますが、これを正規化したいと思います。

文書:

d101 11001
e101 9665
f101 9663
d102 11002
e102 11003
f102 11004
g102 11005

希望の出力:

d101 11001
e101 12001
f101 12002
d102 11002
e102 11003
f102 11004
g102 11005

したがって、列2の長さが4の場合は、それを指定された系列の増分番号で置き換える必要があるというロジックが必要です。この場合、1200は系列で、&1、2、3..は増分です。

答え1

$ awk -v n=12000 'length($2)==4 {$2=++n} {print}' file
d101 11001
e101 12001
f101 12002
d102 11002
e102 11003
f102 11004
g102 11005

最初にインクリメントしてから、n新しい値を使用するように割り当てます。最初から印刷するには、12000次を使用し、$2=n++最初に割り当ててから増分します。

答え2

使用幸せ(以前のPerl6)

raku -ne 'state $i; print .words[0]~" "; put S/^ \d**4 $/{++$i + 12000}/ given .words[1];' 

つまり、rakuは-ne(1行ずつ、自動印刷ではない)フラグを使用してコマンドラインから呼び出されます。コードで増加する変数state(一度だけ)を宣言します。 2番目のステートメントでは、スペース.words[0]で区切られた最初の「単語」(つまり、列)printedの後に~チルダで連結された" "スペース(出力列を区切るために使用されます)が続きます。 3番目のステートメントでは、(big-S)代替コマンドは(2番目の列)内で正確に4つの数字をS///検索します。一致は計算された値で置き換えられ(中括弧は正規表現のコードブロックを表します)、返されます(大きなS置換は変更された文字列を返すためです)。\d**4given .words[1]{++$i + 12000}S///

入力例:

d101 11001
e101 9665
f101 9663
d102 11002
e102 11003
f102 11004
g102 11005

出力例:

d101 11001
e101 12001
f101 12002
d102 11002
e102 11003
f102 11004
g102 11005

https://raku.org

関連情報