다음과 같은 구조의 파일이 있습니다.
Ti 1.9699858320 2.0810775390 4.162155079 5.20200
O 1.6428341970 2.0810775390 4.162155079 -2.14259
O 1.6428341970 2.0810775390 4.162155079 -2.14259
Pb 4.1621550790 4.1621550790 4.192557641 3.39279
O 3.7662066970 4.1621550790 4.192557641 -4.29652
Ti 6.1302323500 6.2584338990 4.192557641 5.23841
O 5.8163744340 6.2584338990 4.192557641 -2.13267
O 5.8163744340 6.2584338990 4.192557641 -2.13267
Pb 8.3547127200 8.3547127200 4.196295567 3.40984
O 7.9266344100 8.3547127200 4.196295567 -4.36260
Ti 10.318243871 10.452860504 4.196295567 5.26652
O 9.9935741680 10.452860504 4.196295567 -2.13625
O 9.9935741680 10.452860504 4.196295567 -2.13625
Pb 12.551008287 12.551008287 4.193631562 3.43289
O 12.112224767 12.551008287 4.193631562 -4.38552
다음을 수행해야 합니다.
- 2열에서 3열을 뺍니다.)
1)의 결과를 5열과 곱합니다. 다음과 같이 합니다.
awk '{print $0," ",($2-$3)*$5 > "file-out.dat"}' file-in.dat
(이것이 까다로운 부분입니다.) 결과는 다음과 같습니다. 2) 5개 항목으로 구성된 각 그룹의 합계를 구해야 합니다. 포인트 2) 이후의 파일 모양은 다음과 같습니다. 5개 그룹의 마지막 열에 항목을 추가하고 결과를 다음과 같이 작성해야 합니다.
Ti 1.9699858320 2.0810775390 4.162155079 5.20200 -0.577899 1 result_of_sum_of_first_group_of_5
O 1.6428341970 2.0810775390 4.162155079 -2.14259 0.938976 2 result_of_sum_of_second_group_of_5
O 1.6428341970 2.0810775390 4.162155079 -2.14259 0.938976 3 result_of_sum_of_third_group_of_5
Pb 4.1621550790 4.1621550790 4.192557641 3.39279 0
O 3.7662066970 4.1621550790 4.192557641 -4.29652 1.7012
Ti 6.1302323500 6.2584338990 4.192557641 5.23841 -0.671572
O 5.8163744340 6.2584338990 4.192557641 -2.13267 0.942767
O 5.8163744340 6.2584338990 4.192557641 -2.13267 0.942767
Pb 8.3547127200 8.3547127200 4.196295567 3.40984 0
O 7.9266344100 8.3547127200 4.196295567 -4.36260 1.86753
Ti 10.318243871 10.452860504 4.196295567 5.26652 -0.708961
O 9.9935741680 10.452860504 4.196295567 -2.13625 0.98115
O 9.9935741680 10.452860504 4.196295567 -2.13625 0.98115
Pb 12.551008287 12.551008287 4.193631562 3.43289 0
O 12.112224767 12.551008287 4.193631562 -4.38552 1.92429
awk 한 줄로 이 모든 작업을 수행할 수 있는 방법이 있나요?
답변1
두 단계에 걸쳐 두 개의 임시 파일을 사용합니다.
첫 번째 단계:정확히 6개의 열과 tmpfile1
세 그룹의 합계가 포함된 중간 파일을 다음과 같이 만듭니다.Ti
tmpfile2
awk '{ $6 = ($2 - $3)*$5; print }' OFS="\t" file | tee tmpfile1 |
awk '$1 == "Ti" && NR > 1 { print ++i, sum; sum = 0 } { sum += $6 } END { print ++i, sum }' OFS="\t" >tmpfile2
첫 번째 awk
명령은 수식을 기반으로 계산된 값이 포함된 여섯 번째 열을 추가합니다. tee
결과를 쓰고 tmpfile1
데이터를 두 번째 awk
프로그램에 전달합니다.
두 번째는 awk
새로운 여섯 번째 열을 요약합니다. line 에 도달하면 Ti
파일의 첫 번째 라인이 아닌 한 현재 합계를 인쇄하고 변수를 재설정합니다 sum
. 마지막 행 집합의 합계가 END
블록에 출력됩니다. 변수는 i
각 출력 전에 증가하며 해당 열에서 원하는 인덱스입니다. 그러면 파일이 생성됩니다 tmpfile2
.
tmpfile1
:
Ti 1.9699858320 2.0810775390 4.162155079 5.20200 -0.577899
O 1.6428341970 2.0810775390 4.162155079 -2.14259 0.938976
O 1.6428341970 2.0810775390 4.162155079 -2.14259 0.938976
Pb 4.1621550790 4.1621550790 4.192557641 3.39279 0
O 3.7662066970 4.1621550790 4.192557641 -4.29652 1.7012
Ti 6.1302323500 6.2584338990 4.192557641 5.23841 -0.671572
O 5.8163744340 6.2584338990 4.192557641 -2.13267 0.942767
O 5.8163744340 6.2584338990 4.192557641 -2.13267 0.942767
Pb 8.3547127200 8.3547127200 4.196295567 3.40984 0
O 7.9266344100 8.3547127200 4.196295567 -4.36260 1.86753
Ti 10.318243871 10.452860504 4.196295567 5.26652 -0.708961
O 9.9935741680 10.452860504 4.196295567 -2.13625 0.98115
O 9.9935741680 10.452860504 4.196295567 -2.13625 0.98115
Pb 12.551008287 12.551008287 4.193631562 3.43289 0
O 12.112224767 12.551008287 4.193631562 -4.38552 1.92429
tmpfile2
:
1 3.00125
2 3.08149
3 3.17763
2단계: 다음을 함께 붙여넣으세요.
paste tmpfile1 tmpfile2
이것은 생산할 것입니다
Ti 1.9699858320 2.0810775390 4.162155079 5.20200 -0.577899 1 3.00125
O 1.6428341970 2.0810775390 4.162155079 -2.14259 0.938976 2 3.08149
O 1.6428341970 2.0810775390 4.162155079 -2.14259 0.938976 3 3.17763
Pb 4.1621550790 4.1621550790 4.192557641 3.39279 0
O 3.7662066970 4.1621550790 4.192557641 -4.29652 1.7012
Ti 6.1302323500 6.2584338990 4.192557641 5.23841 -0.671572
O 5.8163744340 6.2584338990 4.192557641 -2.13267 0.942767
O 5.8163744340 6.2584338990 4.192557641 -2.13267 0.942767
Pb 8.3547127200 8.3547127200 4.196295567 3.40984 0
O 7.9266344100 8.3547127200 4.196295567 -4.36260 1.86753
Ti 10.318243871 10.452860504 4.196295567 5.26652 -0.708961
O 9.9935741680 10.452860504 4.196295567 -2.13625 0.98115
O 9.9935741680 10.452860504 4.196295567 -2.13625 0.98115
Pb 12.551008287 12.551008287 4.193631562 3.43289 0
O 12.112224767 12.551008287 4.193631562 -4.38552 1.92429
결과는 탭으로 구분됩니다.
답변2
순수한 awk
방법은 다음과 같습니다.
$ awk 'BEGIN{c=0}
{
$6 = ($2 - $3)*$5;
a[NR]=$0;
sum+=$6
if(NR%5==0){
a[++c]=$0" "sum;
sum=0;
}
}
END{
for(i in a){
print a[i]
}
}' file
O 3.7662066970 4.1621550790 4.192557641 -4.29652 1.7012 3.00125
O 7.9266344100 8.3547127200 4.196295567 -4.36260 1.86753 3.0815
O 12.112224767 12.551008287 4.193631562 -4.38552 1.92429 3.17763
Pb 4.1621550790 4.1621550790 4.192557641 3.39279 0
O 3.7662066970 4.1621550790 4.192557641 -4.29652 1.7012
Ti 6.1302323500 6.2584338990 4.192557641 5.23841 -0.671572
O 5.8163744340 6.2584338990 4.192557641 -2.13267 0.942767
O 5.8163744340 6.2584338990 4.192557641 -2.13267 0.942767
Pb 8.3547127200 8.3547127200 4.196295567 3.40984 0
O 7.9266344100 8.3547127200 4.196295567 -4.36260 1.86753
Ti 10.318243871 10.452860504 4.196295567 5.26652 -0.708961
O 9.9935741680 10.452860504 4.196295567 -2.13625 0.98115
O 9.9935741680 10.452860504 4.196295567 -2.13625 0.98115
Pb 12.551008287 12.551008287 4.193631562 3.43289 0
O 12.112224767 12.551008287 4.193631562 -4.38552 1.92429
입력 파일이 탭으로 구분된 경우(그런 경우인 것 같음) 탭이 제거됩니다. 이것이 문제가 되면 다음을 사용하여 다시 되돌릴 수 있습니다 sed
.
$ awk '...' | sed 's/ /\t/g'
O 3.7662066970 4.1621550790 4.192557641 -4.29652 1.7012 3.00125
O 7.9266344100 8.3547127200 4.196295567 -4.36260 1.86753 3.0815
O 12.112224767 12.551008287 4.193631562 -4.38552 1.92429 3.17763
Pb 4.1621550790 4.1621550790 4.192557641 3.39279 0
O 3.7662066970 4.1621550790 4.192557641 -4.29652 1.7012
Ti 6.1302323500 6.2584338990 4.192557641 5.23841 -0.671572
O 5.8163744340 6.2584338990 4.192557641 -2.13267 0.942767
O 5.8163744340 6.2584338990 4.192557641 -2.13267 0.942767
Pb 8.3547127200 8.3547127200 4.196295567 3.40984 0
O 7.9266344100 8.3547127200 4.196295567 -4.36260 1.86753
Ti 10.318243871 10.452860504 4.196295567 5.26652 -0.708961
O 9.9935741680 10.452860504 4.196295567 -2.13625 0.98115
O 9.9935741680 10.452860504 4.196295567 -2.13625 0.98115
Pb 12.551008287 12.551008287 4.193631562 3.43289 0
O 12.112224767 12.551008287 4.193631562 -4.38552 1.92429