逐条读取文件记录并根据上面的记录对后续记录进行转换并写入另一个文件

逐条读取文件记录并根据上面的记录对后续记录进行转换并写入另一个文件

数据文件是定长文件,我想逐条读取文件记录,并根据先前的记录对后续记录进行转换(并将结果写入另一个文件)。

例子:

CTD1234abcdTRN0001
AA 5678defg
BB 8910erty
CTD5678qwerTRN5678
AA 9876bvcn
BB 8765zxcv

现在我想TRN0001从该CTD记录写入后续AA记录BB,类似地对于以下CTD记录。我的输出应该如下所示:

CTD1234abcdTRN0001
AA 5678defgTRN0001
BB 8910ertyTRN0001
CTD5678qwerTRN5678
AA 9876bvcnTRN5678
BB 8765zxcvTRN5678

示例2:

AAABBBB11115678xxxx
BBBCCCC22221234YYYY
MTD0001abcdTRN12345 abcdedfg
AA 0002bcde
BB 0003defg
CCCDDDD33331234zzzz
MTD0003qwerTRN56789 defghigk
AA 9876bvcn
BB 8765zxcv
XXXBBBB11115678aaaa
YYYCCCC22221234bbbb 

应该成为

AAABBBB11115678xxxx
BBBCCCC22221234YYYY
MTD0001abcdTRN12345 abcdedfg
AA 0002bcdeTRN12345
BB 0003defgTRN12345
CCCDDDD33331234zzzz
MTD0003qwerTRN56789 defghigk
AA 9876bvcnTRN56789
BB 8765zxcvTRN56789
XXXBBBB11115678aaaa
YYYCCCC22221234bbbb 

你能帮我解决这个问题吗?如何使用 UNIX shell 脚本实现这一点?

答案1

$ cat testdata
CTD1234abcdTRN0001
AA 5678defg
BB 8910erty
CTD5678qwerTRN5678
AA 9876bvcn
BB 8765zxcv
CTDxxxxxxxxTRNyyyy
AA foobarfo
BB foobarfo
AAABBBB11115678xxxx
BBBCCCC22221234YYYY
MTD0001abcdTRN12345 abcdedfg
AA 0002bcde
BB 0003defg
CCCDDDD33331234zzzz
MTD0003qwerTRN56789 defghigk
AA 9876bvcn
BB 8765zxcv
XXXBBBB11115678aaaa
YYYCCCC22221234bbbb

$ awk '/^(C|M)TD/ { s=match($0, /[[:space:]]/); postfix=substr($0, 12, length($0)-s); print; next } /^(AA|BB)[[:space:]]/ { print $0 postfix; next } 1' testdata
CTD1234abcdTRN0001
AA 5678defgTRN0001
BB 8910ertyTRN0001
CTD5678qwerTRN5678
AA 9876bvcnTRN5678
BB 8765zxcvTRN5678
CTDxxxxxxxxTRNyyyy
AA foobarfoTRNyyyy
BB foobarfoTRNyyyy
AAABBBB11115678xxxx
BBBCCCC22221234YYYY
MTD0001abcdTRN12345 abcdedfg
AA 0002bcdeTRN12345
BB 0003defgTRN12345
CCCDDDD33331234zzzz
MTD0003qwerTRN56789 defghigk
AA 9876bvcnTRN56789
BB 8765zxcvTRN56789
XXXBBBB11115678aaaa
YYYCCCC22221234bbbb

答案2

Unix shell 是一种(相当有限的)编程语言,这对于它组织其他程序工作的工作来说是一个额外的好处。这是不是用于一切。

此类文本处理工作最好使用专门为此目的创建的脚本语言(例如 Perl 或 Python)来完成。

相关内容