复制特定字符后的数字

复制特定字符后的数字

文件1包含:

SS1   2.979621e-01   3.022140e-02   4.273952e-05       0.107    0.223

Set   1:  err.est. 7.72199e-05  a 1  tau1 0.0816095  tau2 98.7691

我想要:

  • SS1将第 1 行后面的数字复制2.979621e-01到新的行中file2
  • 接下来,将err.est.第 2 行后面的数字复制到新的行file3
  • 最后将第 2 行后面的数字复制tau1到新的file4.

我知道如何复制特定字符后面的所有字符,例如:

grep "SS1" file1 | sed 's/*^. //' > file2

但是该命令复制整行

有没有办法在sed命令中说只复制一定数量的字符?

答案1

你可以这样做:

awk '{for (i = 1; i < NF; i++) if ($i ~ /^[[:alpha:]]/) f[$i] = $(i+1)}
     END {
       print f["SS1"]      > "file2"
       print f["err.est."] > "file3"
       print f["tau1"]     > "file4"
     }' < file1

有了sed,你可以这样做:

sed -n '
  h; /^\(.*[[:space:]]\)\{0,1\}SS1[[:space:]]\{1,\}\([^[:space:]]\{1,\}\).*$/ {
    s//\2/
    w file2
  }
  g; /^\(.*[[:space:]]\)\{0,1\}err\.est\.[[:space:]]\{1,\}\([^[:space:]]\{1,\}\).*$/ {
    s//\2/
    w file3
  }
  g; /^\(.*[[:space:]]\)\{0,1\}tau1[[:space:]]\{1,\}\([^[:space:]]\{1,\}\).*$/ {
    s//\2/
    w file4
  }' < file1

答案2

说明原理:

$ awk '{ for(i=1;i<=NF;i++) { if ($i=="SS1") print "1 ",$(i+1); '\
'if ($i=="err.est.") print "2 ",$(i+1); '\
'if ($i=="tau1") print "3 ",$(i+1); } }' inputfile

1  2.979621e-01
2  7.72199e-05
3  0.0816095

改为写入文件:

awk '{ for(i=1;i<=NF;i++) { if ($i=="SS1") print $(i+1) >"file2"; '\
'if ($i=="err.est.") print $(i+1) >"file3"; '\
'if ($i=="tau1") print $(i+1) >"file4"; } }' inputfile

一个输出具有三个值:

$ awk '{ for(i=1;i<=NF;i++) { if ($i=="SS1") ss=$(i+1); '\
'if ($i=="err.est.") err=$(i+1); if ($i=="tau1") tau=$(i+1); } }; '\
'END { printf "%12s %16.9f %16.9f\n", ss,err,tau; }' inputfile

2.979621e-01      0.000077220      0.081609500

相关内容