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