0

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

[ molecules ]
; Compound        #mols
Protein_chain_A     1
SOL             12161

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

SOL       12159
CL        2

我已经用 awk 和 sed 尝试了一些零碎的东西,但它一直困扰着我。最好只使用Python之类的其他东西吗?

4

4 回答 4

1

这可能对您有用(GNU sed):

sed -i '$!b;s/\(\S*\)\s*\(\S*\).*/printf "%s\\t\\t%d\\nCL\\t\\t2\\n" "\1" "$((\2-2))"/e' file
于 2012-05-21T13:44:12.787 回答
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
于 2012-05-21T13:11:17.050 回答
1
awk '/^SOL/ {
        match($0, /^SOL([[:space:]]+)/, a);
        num = $2;
        sub(num "$", num - 2);
        print;
        print "CL" a[1] "2";
        next
    }
    {
        print
    }' inputfile
于 2012-05-21T13:13:52.730 回答
0

你可以试试这个简单的一个班轮

awk '{if ( $0 !~ "SOL" ){printf "%s\n",$0}else{printf "%s\t\t%d\nCL\t\t2\n",$1,$2-2}}' filename
于 2012-05-21T18:12:27.117 回答