GNU/Linux >> Znalost Linux >  >> Linux

Vložit nové řádky s chybějícími hodnotami (ne)?

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.

Související:Vypršel časový limit ve skriptu shellu?
Linux
  1. Jak vložit nový řádek do skriptu prostředí Linux?

  2. jak vložit nový řádek, pokud má řádek více než 60 znaků

  3. nahradit řádky v jednom souboru řádky v jiném číslem řádku

  1. Výčet nové sítě pomocí Nmap

  2. Používáte zalamování slov s Mc?

  3. Smazat po sobě jdoucí řádky v CSV s duplicitními hodnotami v jednom poli, ale ponechat poslední řádek?

  1. Duplicitní, s několika malými změnami, několika řádky v textovém souboru?

  2. Zřetězení souborů a vložení nového řádku mezi soubory

  3. sed vložte řádek s mezerami na konkrétní řádek