欠落値を含む新しい行の挿入(NA)

欠落値を含む新しい行の挿入(NA)

値が欠落している場合は、テキストファイルに新しい行を挿入したいと思います。たとえば、次のテキストファイル(A.txt)には5行目はありません。また、ファイルには12行が必要であるため、11〜12行がありません。

1 2.30
2 3.01
3 3.22
4 3.34
6 3.01
7 2.90
8 2.99
9 3.00
10 3.02

私の予想結果は次のとおりです。欠落しているケースでは、番号とNAを表す行を追加する必要があります。ご覧のとおり、これは5行、11行、12行目で予想通りに発生します。

1 2.30
2 3.01
3 3.22
4 3.34
5 NA
6 3.01
7 2.90
8 2.99
9 3.00
10 3.02
11 NA
12 NA

次のスクリプトを使用してこれを実行できます。

f1=/my-directory/
echo "new file" > "$f1"/newfile.txt  

for i in {1..12}; do
l=$(awk '{print $1}' /"$f1"/A.txt | grep -wE ^$i /"$f1"/A.txt)
if grep --quiet -wE ^$i /"$f1"/A.txt; then echo "$l" >> "$f1"/newfile.txt; else echo "$i NA" >> "$f1"/newfile.txt; fi

done

これは素晴らしい作品です。しかし、問題は、160,000行を超える行を含む約600個のファイルに対してこれを行う必要があることです。したがって、ループソリューションがすべての行を検索するのに時間がかかりすぎます。私の質問は:これを行うためのより簡単な解決策はありますか?

ベストアンサー1

joinここでは素晴らしい作品です。

join -a 1 -o 0,2.2 -e NA  <(seq 12)  A.txt  2>/dev/null

join結合フィールドがそうでなければ文句を言うので、stderrを捨てました。語彙的ソートされました。

おすすめ記事