bash 多列文件的处理
bash treatment of multiple-column file
处理由多行组成的多列文件的处理,我需要更改第一列中每一行的名称(特别是删除已处理文件的完整路径)。这是日志的格式:
/scratch_p/john/results_test_docking/7000/7000_12_lig_cne_767.dlg: 2 | -10.50 | 10 | -10.38 | 16 |################
/scratch_p/john/results_test_docking/7000/7000_08_lig_cne_767.dlg: 1 | -10.41 | 11 | -10.34 | 11 |###########
/scratch_p/john/results_test_docking/7000/7000_08_lig_cne_998.dlg: 1 | -9.89 | 1 | -9.34 | 7 |#######
/scratch_p/john/results_test_docking/7000/7000_06_lig_cne_998.dlg: 2 | -9.64 | 12 | -9.39 | 6 |######
/scratch_p/john/results_test_docking/7000/7000_04_lig_cne_900.dlg: 1 | -9.62 | 12 | -8.95 | 11 |###########
/scratch_p/john/results_test_docking/7000/7000_05_lig_cne_767.dlg: 1 | -9.37 | 20 | -9.13 | 5 |#####
/scratch_p/john/results_test_docking/7000/7000_08_lig_cne_331.dlg: 1 | -9.31 | 8 | -8.29 | 6 |######
/scratch_p/john/results_test_docking/7000/7000_12_lig_cne_900.dlg: 1 | -9.16 | 8 | -8.82 | 8 |########
/scratch_p/john/results_test_docking/7000/7000_08_lig_cne_818.dlg: 1 | -9.12 | 3 | -8.35 | 5 |#####
/scratch_p/john/results_test_docking/7000/7000_10_lig_cne_587.dlg: 1 | -9.07 | 19 | -8.50 | 10 |##########
/scratch_p/john/results_test_docking/7000/7000_09_lig_cne_515.dlg: 1 | -9.02 | 12 | -7.93 | 7 |#######
/scratch_p/john/results_test_docking/7000/7000_07_lig_cne_987.dlg: 1 | -9.00 | 16 | -8.77 | 8 |########
/scratch_p/john/results_test_docking/7000/7000_04_lig_cne_767.dlg: 2 | -8.96 | 9 | -8.88 | 8 |########
/scratch_p/john/results_test_docking/7000/7000_12_lig_cne_331.dlg: 1 | -8.94 | 11 | -8.54 | 9 |#########
/scratch_p/john/results_test_docking/7000/7000_10_lig_cne_331.dlg: 1 | -8.90 | 1 | -8.49 | 6 |######
/scratch_p/john/results_test_docking/7000/7000_10_lig_cne_767.dlg: 4 | -8.87 | 4 | -8.86 | 14 |##############
在这里,我应该从每一行的第一列中删除 /scratch_p/john/results_test_docking/7000/(该模式通常在每一行之间共享,但在不同的日志中可能不同......),所以保持只有 .dlg 文件的名称。然后我应该删除第 2、4 列
上述示例的预期输出应为:
7000_12_lig_cne_767.dlg: -10.50 | -10.38 | 16 |################
7000_08_lig_cne_767.dlg: -10.41 | -10.34 | 11 |###########
7000_08_lig_cne_998.dlg: -9.89 | -9.34 | 7 |#######
7000_06_lig_cne_998.dlg: -9.64 | -9.39 | 6 |######
7000_04_lig_cne_900.dlg: -9.62 | -8.95 | 11 |###########
7000_05_lig_cne_767.dlg: -9.37 | -9.13 | 5 |#####
7000_08_lig_cne_331.dlg: -9.31 | -8.29 | 6 |######
7000_12_lig_cne_900.dlg: -9.16 | -8.82 | 8 |########
7000_08_lig_cne_818.dlg: -9.12 | -8.35 | 5 |#####
7000_10_lig_cne_587.dlg: -9.07 | -8.50 | 10 |##########
7000_09_lig_cne_515.dlg: -9.02 | -7.93 | 7 |#######
7000_07_lig_cne_987.dlg: -9.00 | -8.77 | 8 |########
7000_04_lig_cne_767.dlg: -8.96 | -8.88 | 8 |########
7000_12_lig_cne_331.dlg: -8.94 | -8.54 | 9 |#########
7000_10_lig_cne_331.dlg: -8.90 | -8.49 | 6 |######
7000_10_lig_cne_767.dlg: -8.87 | -8.86 | 14 |##############
唯一可能的方法是在文本编辑器中手动编辑 :-)。是否可以使用一些 bash 实用程序来做到这一点?
cat test.txt | # get the file content
cut -d '|' -f 1,2,4- | # pick the columns we want
sed 's/^.*\/\([^/]*.dlg\):[^|]*//' # extract filename (ignoring path) and ignore first column after :
使用 GNU awk:
gawk '
BEGIN { FIELDWIDTHS = "66 6 12 6 12 6 *" }
{
sub(/.*\//, "", )
print
}
' file
这可以稍微简化,因为您保留了第 4 列之后的所有内容:
gawk -v FIELDWIDTHS="66 6 12 6 *" '{sub(/.*\//, "", ); print }' file
# ....................1.2..3.4.5
处理由多行组成的多列文件的处理,我需要更改第一列中每一行的名称(特别是删除已处理文件的完整路径)。这是日志的格式:
/scratch_p/john/results_test_docking/7000/7000_12_lig_cne_767.dlg: 2 | -10.50 | 10 | -10.38 | 16 |################
/scratch_p/john/results_test_docking/7000/7000_08_lig_cne_767.dlg: 1 | -10.41 | 11 | -10.34 | 11 |###########
/scratch_p/john/results_test_docking/7000/7000_08_lig_cne_998.dlg: 1 | -9.89 | 1 | -9.34 | 7 |#######
/scratch_p/john/results_test_docking/7000/7000_06_lig_cne_998.dlg: 2 | -9.64 | 12 | -9.39 | 6 |######
/scratch_p/john/results_test_docking/7000/7000_04_lig_cne_900.dlg: 1 | -9.62 | 12 | -8.95 | 11 |###########
/scratch_p/john/results_test_docking/7000/7000_05_lig_cne_767.dlg: 1 | -9.37 | 20 | -9.13 | 5 |#####
/scratch_p/john/results_test_docking/7000/7000_08_lig_cne_331.dlg: 1 | -9.31 | 8 | -8.29 | 6 |######
/scratch_p/john/results_test_docking/7000/7000_12_lig_cne_900.dlg: 1 | -9.16 | 8 | -8.82 | 8 |########
/scratch_p/john/results_test_docking/7000/7000_08_lig_cne_818.dlg: 1 | -9.12 | 3 | -8.35 | 5 |#####
/scratch_p/john/results_test_docking/7000/7000_10_lig_cne_587.dlg: 1 | -9.07 | 19 | -8.50 | 10 |##########
/scratch_p/john/results_test_docking/7000/7000_09_lig_cne_515.dlg: 1 | -9.02 | 12 | -7.93 | 7 |#######
/scratch_p/john/results_test_docking/7000/7000_07_lig_cne_987.dlg: 1 | -9.00 | 16 | -8.77 | 8 |########
/scratch_p/john/results_test_docking/7000/7000_04_lig_cne_767.dlg: 2 | -8.96 | 9 | -8.88 | 8 |########
/scratch_p/john/results_test_docking/7000/7000_12_lig_cne_331.dlg: 1 | -8.94 | 11 | -8.54 | 9 |#########
/scratch_p/john/results_test_docking/7000/7000_10_lig_cne_331.dlg: 1 | -8.90 | 1 | -8.49 | 6 |######
/scratch_p/john/results_test_docking/7000/7000_10_lig_cne_767.dlg: 4 | -8.87 | 4 | -8.86 | 14 |##############
在这里,我应该从每一行的第一列中删除 /scratch_p/john/results_test_docking/7000/(该模式通常在每一行之间共享,但在不同的日志中可能不同......),所以保持只有 .dlg 文件的名称。然后我应该删除第 2、4 列 上述示例的预期输出应为:
7000_12_lig_cne_767.dlg: -10.50 | -10.38 | 16 |################
7000_08_lig_cne_767.dlg: -10.41 | -10.34 | 11 |###########
7000_08_lig_cne_998.dlg: -9.89 | -9.34 | 7 |#######
7000_06_lig_cne_998.dlg: -9.64 | -9.39 | 6 |######
7000_04_lig_cne_900.dlg: -9.62 | -8.95 | 11 |###########
7000_05_lig_cne_767.dlg: -9.37 | -9.13 | 5 |#####
7000_08_lig_cne_331.dlg: -9.31 | -8.29 | 6 |######
7000_12_lig_cne_900.dlg: -9.16 | -8.82 | 8 |########
7000_08_lig_cne_818.dlg: -9.12 | -8.35 | 5 |#####
7000_10_lig_cne_587.dlg: -9.07 | -8.50 | 10 |##########
7000_09_lig_cne_515.dlg: -9.02 | -7.93 | 7 |#######
7000_07_lig_cne_987.dlg: -9.00 | -8.77 | 8 |########
7000_04_lig_cne_767.dlg: -8.96 | -8.88 | 8 |########
7000_12_lig_cne_331.dlg: -8.94 | -8.54 | 9 |#########
7000_10_lig_cne_331.dlg: -8.90 | -8.49 | 6 |######
7000_10_lig_cne_767.dlg: -8.87 | -8.86 | 14 |##############
唯一可能的方法是在文本编辑器中手动编辑 :-)。是否可以使用一些 bash 实用程序来做到这一点?
cat test.txt | # get the file content
cut -d '|' -f 1,2,4- | # pick the columns we want
sed 's/^.*\/\([^/]*.dlg\):[^|]*//' # extract filename (ignoring path) and ignore first column after :
使用 GNU awk:
gawk '
BEGIN { FIELDWIDTHS = "66 6 12 6 12 6 *" }
{
sub(/.*\//, "", )
print
}
' file
这可以稍微简化,因为您保留了第 4 列之后的所有内容:
gawk -v FIELDWIDTHS="66 6 12 6 *" '{sub(/.*\//, "", ); print }' file
# ....................1.2..3.4.5