我想将每个数字行乘以数值(例如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
...
答案 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