这适用于第一列。我怎么能改变它才能在第二个工作?我仍然可以在一行中完成它,还是必须将其扩展为.pl文件?
列由逗号空格“,”
分隔perl -pe 's/^([-0-9]+)/$1 - 8/e' your_file > output.txt
详细说明:
文件示例。
Title1, Title2, Title3, ..., Titlen
12456, 45, 21, 686731, ...
21, 6876546, 987, 134561, ...
答案 0 :(得分:3)
虽然perl大师正在考虑答案,但这是awk解决方案:
> echo '5 10 15\n20 25 30' | awk '{$2-=8; print}'
5 2 15
20 17 30
<强>更新强>
假设您有一个文件x.txt
,其格式与示例文件相同:
> cat x.txt
t1, t2, t3
1, 12, 3
-4, 22, 13
使用此命令,您可以从第二列中的每个数字字段中减去8:
> awk -F, 'BEGIN {OFS=","} {if ($2+0==$2) {$2-=8}; print}' x.txt > output.txt
> cat output.txt
t1, t2, t3
1,4, 3
-4,14, 13
此处-F,
和BEGIN {OFS=","}
告诉awk使用逗号作为输入/输出字段分隔符。将为每个输入行评估卷曲括号中的下一个块。因此,对于每个输入行,我们测试第二个字段是否为数字($2+0==$2
),如果是,则从中减去8,然后打印结果行。输入文件是x.txt,输出将从标准输出重定向到文件output.txt
。
答案 1 :(得分:2)
在此示例中,字符串被标记为数组。正则表达式版本会更短(如awk)。 它还会在非字符串上跳过-8。
perl -ne '@a = split /,\s+/, $_; if($a[1] =~ /^\d*$/) {$a[1] = $a[1] - 8}; print join ", ", @a;' foo
cat foo
Title1, Title2, Title3
12456, 45, 21, 68673
21, 6876546, 987, 134561
perl -ne '@a = split /,\s+/, $_; if($a[1] =~ /^\d*$/) {$a[1] = $a[1] - 8}; print join ", ", @a;' foo
Title1, Title2, Title3
12456, 37, 21, 68673
21, 6876538, 987, 134561
答案 2 :(得分:2)
在File示例中,字段以逗号和空格分隔。同时拥有两者有点不寻常。但假设这正是您正在处理的问题,对您的oneliner的以下修改可以起作用:
perl -pe '/^([-0-9]+), ([-0-9]+)/; $new = $2 - 8; s/^([-0-9]+), ([-0-9]+)/$1, $new/;'
第一个正则表达式匹配第一个和第二个字段(当它们由数字和 - 组成时)。然后我们在正则表达式语法之外进行计算,最后我们用新计算的值替换第二个字段。
答案 3 :(得分:0)
非常接近您的原件,同时允许您修改任意列:
perl -aF',\s*' -pe '$F[1] =~ s/^([-0-9]+)/$1 - 8/e; $_ = join(", ", @F);' file
-a
autosplit to @F
-F
/,\s*/
$F[1] =~ s/^([-0-9]+)/$1 - 8/e;
替换第二栏$_ = join(", ", @F);
将@F
重新加入$_
以允许-p
打印