按记录类型拆分记录并报告任何意外的记录类型

Car*_*TeX 4 scripting text-processing

我有一个myfile.txt包含多种记录类型的。
记录类型位于位置27,长度为3个字符,如下所示:

12345678901234567890123456E20XXXXXXXXX
12345678901234567890123456I47XXXXXXXXX
12345678901234567890123456I49XXXXXXXXX
12345678901234567890123456I50XXXXXXXXX
12345678901234567890123456W55XXXXXXXXX
12345678901234567890123456E20XXXXXXXXX
12345678901234567890123456I47XXXXXXXXX
12345678901234567890123456Q11XXXXXXXXX
12345678901234567890123456R11XXXXXXXXX
12345678901234567890123456W55XXXXXXXXX
12345678901234567890123456E20XXXXXXXXX
12345678901234567890123456I47XXXXXXXXX
12345678901234567890123456I49XXXXXXXXX
12345678901234567890123456I50XXXXXXXXX
12345678901234567890123456Q11XXXXXXXXX
12345678901234567890123456R11XXXXXXXXX
12345678901234567890123456W55XXXXXXXXX
Run Code Online (Sandbox Code Playgroud)

我想按记录类型拆分它,如下所示:

grep -E '^.{26}(E20)' myfile.txt > E20.txt
grep -E '^.{26}(I47)' myfile.txt > I47.txt
grep -E '^.{26}(I49)' myfile.txt > I49.txt
grep -E '^.{26}(I50)' myfile.txt > I50.txt
grep -E '^.{26}(Q11)' myfile.txt > Q11.txt
grep -E '^.{26}(R11)' myfile.txt > R11.txt
grep -E '^.{26}(W55)' myfile.txt > W55.txt
Run Code Online (Sandbox Code Playgroud)

并做其他事情,例如

echo "Unexpected record type"
Run Code Online (Sandbox Code Playgroud)

当记录类型不是(E20、I47、I49、I50、Q11、R11、W55)时。

例如,E20.txt文件将是:

12345678901234567890123456E20XXXXXXXXX
12345678901234567890123456E20XXXXXXXXX
12345678901234567890123456E20XXXXXXXXX
Run Code Online (Sandbox Code Playgroud)

等等。

在 Linux 上有没有一种优雅的方法(在脚本中)做到这一点?

ter*_*don 5

这是一种awk方法。首先,创建一个包含“良好”记录的文件,每行一个:

$ cat goodRecs 
E20
I47
I49
I50
Q11
R11
W55
Run Code Online (Sandbox Code Playgroud)

然后:

gawk 'FNR==NR{good[$1]; next} 
     { 
        rec=substr($1,27,3); 
        if(rec in good){
            print > rec".txt"
        }
        else{
            print "Bad record: "rec
        }
    }' goodRecs myfile.txt 
Run Code Online (Sandbox Code Playgroud)