파일 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
- 그런 다음 행 2 뒤의 숫자를
err.est.
새 행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