myfile.txt
複数のレコードタイプを含むレコードがあります。
レコードタイプは、次のように位置27にあり、長さは3文字です。
12345678901234567890123456E20XXXXXXXXX
12345678901234567890123456I47XXXXXXXXX
12345678901234567890123456I49XXXXXXXXX
12345678901234567890123456I50XXXXXXXXX
12345678901234567890123456W55XXXXXXXXX
12345678901234567890123456E20XXXXXXXXX
12345678901234567890123456I47XXXXXXXXX
12345678901234567890123456Q11XXXXXXXXX
12345678901234567890123456R11XXXXXXXXX
12345678901234567890123456W55XXXXXXXXX
12345678901234567890123456E20XXXXXXXXX
12345678901234567890123456I47XXXXXXXXX
12345678901234567890123456I49XXXXXXXXX
12345678901234567890123456I50XXXXXXXXX
12345678901234567890123456Q11XXXXXXXXX
12345678901234567890123456R11XXXXXXXXX
12345678901234567890123456W55XXXXXXXXX
次のようにレコードタイプ別に分割したいと思います。
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
そして、次のような他のことをしてください
echo "Unexpected record type"
レコードの種類が(E20、I47、I49、I50、Q11、R11、W55)でない場合.
たとえば、E20.txt
ファイルは次のようになります。
12345678901234567890123456E20XXXXXXXXX
12345678901234567890123456E20XXXXXXXXX
12345678901234567890123456E20XXXXXXXXX
など。
Linuxでこれを行うエレガントな方法(スクリプト)はありますか?
ベストアンサー1
これは一つのawk
方法です。まず、「良い」レコードが1行に1つずつ含まれるファイルを作成します。
$ cat goodRecs
E20
I47
I49
I50
Q11
R11
W55
それから:
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