使用awk或shell修改一些字段并将其重新放回到行中

时间:2017-02-19 01:35:18

标签: python awk gawk

我有一个包含数千行的文本文件,我想通过进行一些更改来更新这些行。

原帖:

b1522   ftp://ftp.genecard.giv.nlm.org/genome/all/ABC_001596115.1_ASM159611v1#
dd1120  ftp://ftp.genecard.giv.nlm.org/genome/all/ABC_231146189.1_ASM159611v1#

期望的输出:

b1522   ftp://ftp.genecard.giv.nlm.org/genome/all/ABC/001/596/115/ABC_001596115.1_ASM159611v1#
dd1120  ftp://ftp.genecard.giv.nlm.org/genomes/all/ABC/231/146/189/ABC_231146189.1_ASM159611v1#

我想复制来自" ABC"在"。"之前的最后一个数字,在" all"之后将它们粘贴在两个正斜杠中,删除下划线并在每三个字符后放置正斜杠。我不知道如何用awk去做。我的awk知识非常基础

2 个答案:

答案 0 :(得分:1)

我不知道如何在awk中执行此操作,但您可以轻松地使用' sed'

  sed -r -e 's%/(ABC_)((...)(...)(...))%/ABC/\3/\4/\5/\1\2%' < infile.txt > out file.txt

这是做什么的

匹配包含ABC _

的每一行

(ABC_)将ABC_捕获到名为\ 1

的变量中

((...)(...)(...))。将接下来的9个字符捕获到名为\ 2

的变量中

(...)捕获三个字符并将它们放入变量中。这三次出现将分别创建名为\ 3,\ 4和\ 5

的变量

s%pattern%replacement%匹配模式并用替换替换所有模式。

在这种情况下,我们匹配ABC_和9个字符,将它们存储在变量中,然后用以下内容替换整个批次:

/ABC/\3/\4/\5/\1\2

其中/ ABC / \ 3 / \ 4 / \ 5 /

您是(添加)插入

和\ 1 \ 2

将原始文本放回插入的右侧

答案 1 :(得分:1)

另一个类似的sed

sed -i.bak -r 's~((ABC)_(...)(...)(...))~\2/\3/\4/\5/\1~' file