我有一组文件(不同的行号)总是像这样完成
[ molecules ]
; Compound #mols
Protein_chain_A 1
SOL 12161
我想用bash做的是从SOL的值中减去2,并在文件中添加一个这样的新行(理想情况是SOL和CL之间有两个标签及其各自的值)
SOL 12159
CL 2
我用awk和sed尝试过点点滴滴,但它一直在烦我。是否最好只使用像Python这样的东西?
答案 0 :(得分:1)
我会使用我认识最好的语言(在我的情况下是Perl)。但是bash及其工具也可以很好地为您服务:
{
head -n-1 "$file"
read sol num < <(tail -n1 "$file")
echo $sol$'\t'$((num-2))
echo CL$'\t'2
} > "$file".new
mv "$file".new $file
答案 1 :(得分:1)
awk '/^SOL/ {
match($0, /^SOL([[:space:]]+)/, a);
num = $2;
sub(num "$", num - 2);
print;
print "CL" a[1] "2";
next
}
{
print
}' inputfile
答案 2 :(得分:1)
这可能适合你(GNU sed):
sed -i '$!b;s/\(\S*\)\s*\(\S*\).*/printf "%s\\t\\t%d\\nCL\\t\\t2\\n" "\1" "$((\2-2))"/e' file
答案 3 :(得分:0)
你可以试试这个简单的单线
awk '{if ( $0 !~ "SOL" ){printf "%s\n",$0}else{printf "%s\t\t%d\nCL\t\t2\n",$1,$2-2}}' filename