我有一个以下格式的文件。
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?
答案 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
)恢复。