識別子を含むレコードを含むファイルがあります。各識別子に複数のレコードがある可能性があります。同じ識別子を持つすべてのレコードを検索し、そのレコード内の特定のパターン(特定の場所のY)を見つけたいです。パターンがある場合は、このメトリックの最初のレコードをそのパターンに更新したいと思います。スクリプトでこれを最良に達成するにはどうすればよいですか? (UnixまたはWindows)。ファイルは識別子でソートされます。
以下は、私が達成したい仕事の例です。
identifier1aaaNbbb
identifier1cccNddd
identifier1eeeYfff
識別子1のレコードの1つの位置14に「Y」がある場合、その「Y」は識別子1のレコードの最初の項目に書き込まれます。
identifier1aaaYbbb
identifier1cccNddd
identifier1eeeYfff
awk
どのツール(、、、grep
)sed
がこの作業に最適なのかわかりません。問題を解決する方法をご存知ですか?
ベストアンサー1
入力ファイルを2回使用しawk
て読み込み処理します。
Y
これはあなたの識別子の長さが11文字で、行の15番目の文字を探していると仮定します(あなたの例のように)。識別子の長さが常に11文字でない場合は、スクリプトの最初の行を変更する必要があります。
最初のパス:各識別子の最初のレコードを配列に保存し、Y
レコードが見つかったらこの配列要素を変更します。
2番目のステップ:各識別子の最初のレコード行を保存され、変更された配列値に置き換えて、その行を印刷します。
awk '{
ident=substr($0,0,11) # get identifier
if (NR==FNR){ # first pass
if (!(ident in a)){ # if identifier is not present in array
a[ident]=$0 # save current line in array
}
if (substr($0,15,1) == "Y"){ # if `Y` is found in current line
# replace character with `Y` in array value
a[ident]=substr(a[ident],0,14)"Y"substr(a[ident],16)
}
}
else { # second pass
if (ident in a){ # if identifier is present in array
$0=a[ident] # replace current line
delete a[ident] # delete array element
}
print # print current line
}
}' file file