Text-Processing

awk 腳本用 if 將值替換為增量

  • May 18, 2022

我有一個管道分隔文件

d1000|1000
d1001|100
d1002|10
d1003|1
d1004|
d1005|

如果長度小於 4 位,我想修改 $2,並且保留空格

所以試圖通過 awk 腳本來做

BEGIN { FS="|"; OFS="\t" }

{
n=1100
{ if (length($2)!=4 && length($2)>0) {$2=++n}};

print $1, $2
}

但它一遍又一遍地列印相同的數字

d1000   1000
d1001   1101
d1002   1101
d1003   1101
d1004
d1005

而想要的輸出

d1000   1000
d1001   1101
d1002   1102
d1003   1103
d1004
d1005

編輯:這是上面的程式碼,格式為gawk -o-

BEGIN {
       FS = "|"
       OFS = "\t"
}

{
       n = 1100
       if (length($2) != 4 && length($2) > 0) {
               $2 = ++n
       }
       print $1, $2
}

如果縮進更一致,錯誤可能很明顯:

BEGIN { FS="|"; OFS="\t" }
{
 n=1100
 {
   if (length($2)!=4 && length($2)>0) {
     $2=++n
   }
 };
 print $1, $2
}

對於每條記錄,外大括號內的所有內容都會無條件地執行 - 因此n每行都會重置 的值。

您應該將初始化移動nBEGIN塊:

BEGIN { FS="|"; OFS="\t"; n=1100 }
{
 {
   if (length($2)!=4 && length($2)>0) {
     $2=++n
   }
 };
 print $1, $2
}

或(更慣用的)

BEGIN { FS="|"; OFS="\t"; n=1100 }
(length($2)!=4 && length($2)>0) {
 $2=++n
}
{
 print $1, $2
}

引用自:https://unix.stackexchange.com/questions/702967