![复制特定字符后的数字](https://linux22.com/image/174298/%E5%A4%8D%E5%88%B6%E7%89%B9%E5%AE%9A%E5%AD%97%E7%AC%A6%E5%90%8E%E7%9A%84%E6%95%B0%E5%AD%97.png)
文件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