Bash初学者:编辑值并添加新值

时间:2012-05-21 13:05:22

标签: bash awk sed

我有一组文件(不同的行号)总是像这样完成

[ molecules ]
; Compound        #mols
Protein_chain_A     1
SOL             12161

我想用bash做的是从SOL的值中减去2,并在文件中添加一个这样的新行(理想情况是SOL和CL之间有两个标签及其各自的值)

SOL       12159
CL        2

我用awk和sed尝试过点点滴滴,但它一直在烦我。是否最好只使用像Python这样的东西?

4 个答案:

答案 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