如果长度等于,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

所以逻辑应该是,如果column2的长度= 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(逐行,非自动打印)标志调用。声明变量state(一次且仅一次),以便在代码中递增。在第二个语句中,.words[0]第一个空格分隔的“单词”(即列)printed后面跟着~波浪号连接的" "空格(用于分隔输出列)。在第三个语句中, (big-S) 替换命令在(第二列)内精确S///搜索\d**44 个数字。given .words[1]匹配项将替换为{++$i + 12000}计算值(花括号表示正则表达式中的代码块)并返回(因为S///大 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

相关内容