在Bash中,修改fi中的列和行

2024-06-28 11:59:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些文件的名称如下:

 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列每行的开始处添加#

我非常感谢你的帮助


Tags: 文件the名称bash结构datcascheme
1条回答
网友
1楼 · 发布于 2024-06-28 11:59:37

假设您的输入是tab分隔的,下面是一个GNU Awk脚本:

脚本.awk:

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

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

例如:

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

对于第一个字段的转换,脚本在下划线的左边取一个字符,右边取两个字符。下划线将转换为点,字段1中的所有其他字符将被丢弃。你知道吗

相关问题 更多 >