插入具有特定字符的新列,保持特定长度的行

插入具有特定字符的新列,保持特定长度的行

我必须在第四列后插入一列带有字符“A”。

每行新行前必须正好有 80 个字符(包括空格);如果没有,我们可以添加空格来均衡。我必须对大量文件执行此操作。

单个文件的示例表示:

前:

ATOM    558  O   VAL    86     -12.863  -8.701 -49.495  1.00 64.57           O
ATOM    560  CA  VAL    87     -13.628 -10.486 -47.550  1.00 58.11           C 
.....
.....
.....

后:

ATOM    558  O   VAL A  86     -12.863  -8.701 -49.495  1.00 64.57           O  
ATOM    560  CA  VAL A  87     -13.628 -10.486 -47.550  1.00 58.11           C  
.......
.......

答案1

也许您可以只替换第 5 列中的一个空格?

$ sed 's/  / A/5' file
ATOM    558  O   VAL A  86     -12.863  -8.701 -49.495  1.00 64.57           O
ATOM    560  CA  VAL A  87     -13.628 -10.486 -47.550  1.00 58.11           C

您可以将多个文件名传递给,只需使用类似或任何可以捕获您想要编辑的文件的sedshell glob 。*.txt

测试后使用该-i标志来修改文件。

这不会改变每行的字符数...如果您需要将行填充到 80 个字符,则可以使用类似

sed 's/  / A/5' file | awk '{printf "%-80s\n", $0}' 

答案2

使用perl

perl  -lane '$"="\t"; print sprintf("%-80s", "@F[0..3]\tA\t@F[4..10]");' file

输出:

ATOM    558     O       VAL     A       86      -12.863 -8.701  -49.495 1.00    64.57   O                         
ATOM    560     CA      VAL     A       87      -13.628 -10.486 -47.550 1.00    58.11   C

要检查长度是否正好是“80”,请将输出传递给awk '{ print length($0), "->", $0 }'

$ perl ... | awk '{ print length($0), "->", $0 }'
80 -> ATOM      558     O       VAL     A       86      -12.863 -8.701  -49.495 1.00    64.57   O                         
80 -> ATOM      560     CA      VAL     A       87      -13.628 -10.486 -47.550 1.00    58.11   C 

相关内容