在Bash中,修改文件中的列和行

时间:2016-05-04 19:02:56

标签: python bash file row

我有一些文件名如下:

 d_Ca-1_O_7.dat
 d_Ca-1_O_8.dat
 d_Ca-1_O_14.dat
 d_Ca-1_O_16.dat
 d_Ca-1_O_10.dat

在每个文件中,我都有这种结构:

 abcA_BCdef  1 G   1     2.4733     4.6738    7 O    0 0 0
 ghiJ_KLmno  1 P   1     2.4811     4.6887    7 O    0 0 0
 pqrS_TLxyz  1 L   1     2.4872     4.7000    7 O    0 0 0
 ... 
 (the same scheme)       

我想制作一个覆盖这些文件的bash脚本,例如:

for {i = 7, 8, 14, 16} in d_Ca-1_O_i.dat 

并将每个文件转换为以下格式:

 A.BC     2.4733     #  0 0 0
 J.KL     2.4811     #  0 0 0
 S.TL     2.4872     #  0 0 0
 ... 
 (the same scheme)       

在每一行中:

1)第一列:我们减少开头的相同位,结尾的相同位

2)第一栏:将_替换为.

2)删除第2,第3,第4,第6,第7,第8列

4)在第9列的每一行的开头添加#

我非常感谢一些帮助

1 个答案:

答案 0 :(得分:1)

假设您的输入是制表符分隔符,这是一个GNU Awk脚本:

<强> script.awk:

BEGIN { OFS=FS="\t"}
      { strange = gensub(/^.*(.)_(..).*$/,"\\1.\\2","",$1)
        print strange, $5, "#" $9 }

在bash的for循环中使用它:awk -f script.awk yourfile

E.g。类似的东西:

for i in 7 8 14 16 
do 
  awk -f script.awk "d_Ca-1_O_${i}.dat"
done

对于第一个字段的转换,脚本左边有一个字符,下划线右边有两个字符。下划线转换为一个点,第一个字段中的所有其他字符都被丢弃。