Text-Processing

如果長度等於,awk 用增量值替換列值

  • May 22, 2022

我有非標準數據,我想對其進行標準化

文件:

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

所以邏輯應該是,如果 column2 = 4 的長度,它應該用提供的系列的增量編號替換它:在這種情況下,1200 是系列,& 1、2、3 .. 是增量。

$ 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++,首先分配然後增加。

使用Raku(以前稱為 Perl6)

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

簡而言之,raku 是在命令行中使用-ne(逐行、非自動列印)標誌呼叫的。聲明一個state變數(一次且僅一次),用於在程式碼中遞增。在第二個語句中,.words[0]第一個空格分隔的“單詞”(即列)printed後跟一個~波浪號連接的" "空格(用於分隔輸出列)。在第三個語句中, (big-S)替換命令在(第二列)中S///搜尋\d**4正好 4 個數字。given .words[1]匹配被替換{++$i + 12000}為計算值(花括號表示正則表達式中的程式碼塊)並返回(因為S///big-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

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