sed: trích xuất dữ liệu từ cột đã chọn
Dec 17 2020
Tôi có một tệp nhật ký được sắp xếp theo định dạng sau:
# This file was created Thu Dec 17 16:01:26 2020
# Created by:
# :-) GROMACS - gmx gyrate, 2019.3 (-:
#
# Executable: /usr/local/bin/../Cellar/gromacs/2019.3/bin/gmx
# Data prefix: /usr/local/bin/../Cellar/gromacs/2019.3
# Working dir: /Users/gleb/Desktop/DO/unity_or_separation
# Command line:
# gmx gyrate -f /Users/gleb/Desktop/DO/unity_or_separation/storage/7000_cne_lig177/1AllBoxes_7000_cne_lig177.xtc -s /Users/gleb/Desktop/DO/unity_or_separation/storage/7000_cne_lig177/lig_1AllBoxes_7000_cne_lig177.pdb -o /Users/gleb/Desktop/DO/unity_or_separation/storage/7000_cne_lig177/RG/RG_1AllBoxes_7000_cne_lig177.xvg
# gmx gyrate is part of G R O M A C S:
#
# God Rules Over Mankind, Animals, Cosmos and Such
#
@ title "Radius of gyration (total and around axes)"
@ xaxis label "Time (ps)"
@ yaxis label "Rg (nm)"
@TYPE xy
@ view 0.15, 0.15, 0.75, 0.85
@ legend on
@ legend box on
@ legend loctype view
@ legend 0.78, 0.8
@ legend length 2
@ s0 legend "Rg"
@ s1 legend "Rg\sX\N"
@ s2 legend "Rg\sY\N"
@ s3 legend "Rg\sZ\N"
1 0.535827 0.476343 0.375777 0.453993
2 0.509863 0.450424 0.333084 0.453975
3 0.51779 0.374447 0.44955 0.440349
4 0.535215 0.392331 0.442183 0.472716
5 0.542371 0.468222 0.383178 0.47146
6 0.49479 0.340223 0.42002 0.44437
7 0.495905 0.370873 0.445952 0.394239
8 0.518463 0.424257 0.400878 0.443746
Từ dữ liệu này, tôi cần bỏ qua tất cả các dòng có nhận xét (bắt đầu từ # và @), chỉ lấy cột thứ hai từ bảng nhiều cột ở dưới cùng và cuối cùng nhân các giá trị với 10:
#this is a second column after conversion
5.4
5.1
5.2
5.4
5.4
4.9
5.0
5.2
Tôi có thể làm điều đó bằng cách kết hợp sed + awk:
sed -i '' -e '/^[#@]/d' "${storage}"/"${experiment}"/RG/RG_${pdb_name}.xvg awk '-F ' '{ printf("%.1f\n", $2*10) }' "${storage}"/"${experiment}"/RG/RG_${pdb_name}.xvg > "${storage}"/"${experiment}"/RG/RG_${pdb_name}..xvg
có thể thực hiện tất cả các bước chỉ bằng cách sử dụng sed (lệnh đầu tiên), do đó không giới hạn việc tạo tệp mới (kết quả từ AWK)?
Trả lời
6 Quasímodo Dec 17 2020 at 22:55
Sed không được tạo ra cho số học. Bạn có thể thử các cách giải quyết vụng về, nhưng Awk tốt hơn về mặt đó:
awk '!/^[#@]/{printf("%.1f\n",$2*10)}' file
Với GNU Awk, thêm -i inplaceđể chỉnh sửa tệp tại chỗ. Nếu bạn không có GNU Awk, bạn có thể sử dụngsponge
awk '!/^[#@]/{printf("%.1f\n",$2*10)}' file | sponge file
hoặc sử dụng tính năng ghi đè cũ tốt (dù sao thì đó cũng là điều xảy ra bên dưới ...)
awk '!/^[#@]/{printf("%.1f\n",$2*10)}' file > newfile &&
mv newfile file