Text-Processing
如果長度等於,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
所以邏輯應該是,如果 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