Rád bych vložil nové řádky do textových souborů, pokud tam chybí hodnoty.
Mám například následující textový soubor (A.txt), u kterého chybí řádek 5. Navíc, protože soubor by měl mít 12 řádků, řádky 11-12 také chybí.
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
Můj očekávaný výstup je následující. Pro chybějící případy je třeba přidat řádek s číslem a NA. Jak vidíte, stalo se to podle přání na řádku 5, 11 a 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
Mohu to udělat pomocí následujícího skriptu:
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
Tohle funguje dobře. Problém je však v tom, že to musím udělat pro asi 600 souborů obsahujících více než asi 160 000 řádků. Řešení smyčky by proto zabralo příliš mnoho času prohledávání všech řádků. Moje otázka zní:existuje jednodušší řešení, které by to dokázalo?
Přijatá odpověď:
Můžete to udělat pomocí awk
skript:
awk '{ while (NR + shift < $1) { print (NR + shift) " NA"; shift++ }; print } END { shift++; while (NR + shift < 13) { print (NR + shift) " NA"; shift++ } }' /tmp/test1
vytvoří požadovaný výstup pro /tmp/test1
(nahraďte jej každým souborem, který chcete zpracovat).
Ve čtivější podobě:
#!/usr/bin/awk -f
{
while (NR + shift < $1) {
print (NR + shift) " NA"
shift++
}
print
}
END {
shift++
while (NR + shift < 13) {
print (NR + shift) " NA"
shift++
}
}
Uložte to jako soubor, řekněte fill-missing
, udělejte jej spustitelným a poté můžete jednoduše spustit
./fill-missing /tmp/test1
Skript zpracovává každý řádek a sleduje očekávaný rozdíl s aktuálním číslem řádku v shift
. Takže pro každý řádek, pokud aktuální upravený řádek neodpovídá prvnímu číslu v řádku, vytiskne příslušné číslo řádku následované NA
a zvyšuje deltu; jakmile se čísla řádků shodují, vytiskne aktuální řádek. Na konci procesu vytiskne všechny chybějící řádky potřebné k dosažení 12.