从文本文件的第2列中的每个值Perl,减8

时间:2015-01-27 20:07:30

标签: perl output

这适用于第一列。我怎么能改变它才能在第二个工作?我仍然可以在一行中完成它,还是必须将其扩展为.pl文件?

列由逗号空格“,”

分隔
perl -pe 's/^([-0-9]+)/$1 - 8/e' your_file > output.txt

详细说明:

  • -p逐行读取文件并将其打印
  • -e运行带有$ _
  • 行内容的perl代码
  • s /.../.../ e - 用表达式替换regexp
  • ... ^([ - 0-9] +) - 匹配任何数字和/或 - 符号。还捕获匹配的片段。
  • $ 1 - 4.91 - 使用regexp捕获的值进行工作。

文件示例。

Title1, Title2, Title3, ..., Titlen

12456, 45, 21, 686731, ...

21, 6876546, 987, 134561, ...

4 个答案:

答案 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打印