bash:用部分空格填充的字符串

时间:2017-05-18 09:11:38

标签: bash sed

我有一个以下格式的文件。

33256SOL    OW 100092   1.507   1.186   0.847
33256SOL    HW1100093   1.561   1.233   0.783
...

我想将其改为

33256SOL    OW     92   1.507   1.186   0.847
33256SOL    HW1    93   1.561   1.233   0.783
...

我想在bash中做一个for循环。但是,格式化错误。没有空间填充一致的格式。

for i in {100001..200000}; do
        j=$(expr $i - 100000)
        sed -i "s/$i/$j/g" number.txt
done

无论如何用空格填充变量并将其放入sed?

2 个答案:

答案 0 :(得分:0)

awk 解决方案:

awk -F"[[:space:]][[:space:]]+" '{$2=substr($2,1,3) " " substr($2,4)-100000}1' file

输出:

33256SOL OW  92 1.507 1.186 0.847
33256SOL HW1 93 1.561 1.233 0.783
  • -F"[[:space:]][[:space:]]+" - 字段分隔符(按多个空格)

  • substr($2,1,3) - 获取第2个字段的前3个字符

  • substr($2,4)-100000 - 从第2个字段的6分数中减去100000

要获得制表符格式的输出,只需添加OFS(输出字段分隔符),如下所示:

awk -F"[[:space:]][[:space:]]+" -v OFS="\t" '{$2=substr($2,1,3)" "substr($2,4)-100000}1' file

输出:

33256SOL    OW  92  1.507   1.186   0.847
33256SOL    HW1 93  1.561   1.233   0.783

答案 1 :(得分:0)

另一种解决方案:

cat number.txt | cut -c -15 > prefix
cat number.txt | cut -c 16- | awk '{printf "%s %s %s %s\n", $1 - 100000, $2, $3, $4}' | paste prefix -

第一行恢复我们不想改变的行的第一部分。 第二行包含我们想要更改的行(cut),更改它(awk),并粘贴部分先前通过第一行(paste)恢复。