我有非标准数据,我想对其进行标准化
文件:
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**4
4 个数字。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