【问题标题】:In Bash, modifying columns and rows in a file在 Bash 中,修改文件中的列和行
【发布时间】:2016-05-04 19:02:55
【问题描述】:

我有一些文件命名如下:

 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 列的每一行开头添加一个#

非常感谢您的帮助

【问题讨论】:

    标签: python bash file row


    【解决方案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

    例如类似:

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

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

    【讨论】:

    • @Lars Fischer:非常感谢您,但只打印了第 1 列和“#”列。第 5 列不打印,0 0 0 列也一样
    • @DavidC。如果文件不是制表符分隔,请删除OFS=FS="\t"并根据需要调整编号(例如三个“0”将是三个字段$9$10$11)。
    • 非常感谢您,但我非常想了解语法,否则我什么都学不到……请您扩展/^.*(.)_(..).*$/,"\\1.\\2","",$1命令中的每个符号做?非常感谢
    • @DavidC。这称为 正则表达式,一个好的起点是 stackoverflow.com/questions/22937618/… ,假设 \\1\\2 只是 \1\2 (反斜杠必须被转义,但是这发生在正则表达式引擎之外)。
    • 非常感谢...我现在已经用打勾和 +1 标记了这个答案以供您发表评论。这些天我一直在深入学习awk...请点击stackoverflow.com/questions/37104901/…查看我的进度(我相信...查看我制作的大脚本)但不幸的是一个新卡住...非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-17
    • 2013-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    相关资源
    最近更新 更多