在linux / awk / bash中仅乘以数字值的行

时间:2015-10-19 20:50:25

标签: linux shell awk

我想将每个数字行乘以数值(例如2),除了该行有标题(带空格的字符行)。

Input.file

fixedStep chrom=chr1 start=9992 step=1
3
6
10
23
...
fixedStep chrom=chr1 start=11166 step=1
2
4
6
 ...

预期产出

fixedStep chrom=chr1 start=9992 step=1
6
12
20
46
...
fixedStep chrom=chr1 start=11166 step=1
4
8
12
...

我的代码:

while read line; do echo 2*$line;  done <Input.file | bc 

此代码完美地进行乘法,但不保持标头不变。有人可以帮忙吗?

我的代码的示例输出:

(standard_in) 1: illegal character: S
(standard_in) 1: parse error
(standard_in) 1: parse error
(standard_in) 1: parse error
6
12
20
46
...

3 个答案:

答案 0 :(得分:1)

您可以使用awk:

awk 'NF==1{$1 *= 2} 1' file
fixedStep chrom=chr1 start=9992 step=1
6
12
20
46
0
fixedStep chrom=chr1 start=11166 step=1
4
8
12

或者检查第一个字段是否为数字:

awk '$1*1{$1 *= 2} 1' file

答案 1 :(得分:1)

Perl解决方案:

perl -lpe '$_ *= 2 if /^[0-9]+$/' Input.file
  • -l处理换行符。
  • -p逐行读取输入并打印出来。
  • $_是主题变量。如果它只包含数字,则将其乘以2.

答案 2 :(得分:1)

当我试图接近OP的解决方案时,只对有空格的字段使用bc。

while read line; do
        if [[ "${line}" = *\ * ]]; then
           echo $line
        else
           echo 2*$line | bc
        fi
done <Input.file

您可以将bc替换为((line *= 2))并显示结果,从而改善这一点。使用此方法时,可以跳过if语句:

while read line; do
   (( line *= 2 )) 2>/dev/null
   echo $line
done <Input.file