私の入力ファイルは次のとおりです。
#key string pos(string)
key1 AA000AA000000AAA0A 2, 3, 18, 12
key2 00A00AAA000AAAA00A 3, 18
各キー行の末尾に新しい列(タブ区切り)を追加したいと思います。入力ファイルの列2にある場合、A
新しい列には入力ファイルの列3に指定された場所が含まれます。入力ファイルの列2にaがある場合、0
その場所は新しい列に印刷しないでください。
デフォルトでは、これは望ましい出力です。
#key string pos(string) Apos(string)
key1 AA000AA000000AAA0A 2, 3, 18, 12 2, 18
key2 00A00AAA000AAAA00A 3, 18 3, 18
簡単な説明:
(キー1)
- インデックス2の文字列は、新しい列に
A
->エントリを追加します。2
- インデックス3の文字列には
0
->エントリがあります。3
いいえ新しい列に追加 - インデックス12の文字列には
0
->エントリがあります。12
いいえ新しい列に追加 - インデックス18の文字列は、新しい列に
A
->エントリを追加します。18
私はPythonでこれを行っていますが、いくつかのキーと項目(文字列を処理するにはかなり長い)があり、コマンドライン(より軽い)ソリューションに関するアドバイスを求めると思いました。
私の意見は次のとおりです。
- pos(string) フィールドを分割して、文字列フィールドで検索中のインデックスを取得します。
- 文字列の特定のインデックスにある文字を取得します。
- 陳述書(?)
ベストアンサー1
次のスクリプトはどうですかawk
?
#!/usr/bin/awk -f
BEGIN {
FS="\t"
print "#key\tstring\tpos(string)\tApos(string)"
}
{
out=""
printf "%s\t",$0
split($2,str,"")
gsub(/ /,"",$3)
split($3,pos,",")
for (i in pos){
if (str[pos[i]]=="A"){
out = out pos[i] ", "
}
}
gsub(/, $/,"",out)
print out
}
たとえば、別の名前で保存しfindA.awk
て実行可能にしますchmod +x findA.awk
。
次に、入力データに対して実行し、出力を新しいファイルにリダイレクトします。
./findA.awk input.txt > output.txt
cat output.txt
#key string pos(string) Apos(string)
key1 AA000AA000000AAA0A 2, 3, 18, 12 2, 18
key2 00A00AAA000AAAA00A 3, 18 3, 18
出力は必要に応じてタブで区切られており、タブの幅がさまざまな文字列の幅と一致しないため、例ほどきれいではありません。