při čtení smyčky

Mám níže uvedený soubor

var 3 2014 string var1 4 2011 string4 var2 6 1999 string2 var3 1 2016 string6 

Pak mám to while read loop to compare one of the columns to a number then echo something. Namísto opakování mé požadované fráze však odráží něco jiného.

while read num do if [ "$num" = "0" ]; then echo "Number is equal to zero" else echo "number is not equal to 0" fi done < home/dir/file.txt | awk "{print $2}" 

místo opakování výše uvedeného ozývá druhý sloupec souboru.

Komentáře

  • Nemohu ' t skutečně spustit problém při spuštění skriptu tak, jak je, ale v v každém případě máte se skriptem jiné problémy. Hlavně uděláte read num a očekáváte, že výsledkem bude jediné číslo (které porovnáte s řetězcem " 0 "), ale ve skutečnosti čtete vstupní soubor se 4 sloupci, takže $num bude řetězec se 4 sloupci.
  • Není testováno, ale myslím, že vaším problémem je, že potrubí bude provedeno po smyčce while? Proč ne všechny v awk: awk '{if ($2==0){print "equal"}else{print "not"}}' file.txt?
  • Jak je uvedeno, tento fragment kódu vytiskne druhé slovo z každého řádku vytvořeného whiledone smyčka. Tj. is x4

Odpověď

měli byste zkusit

awk "{print $2}" home/dir/file.txt | while read num do if [ "$num" = "0" ]; then echo "Number is equal to zero" else echo "number is not equal to 0" fi done 

pro smíšené řešení awk / bash.

Jak již uvedli ostatní, přesměrování awk nastane později.

Odpověď

Vypadá to, že se snažíte přesměrovat výstup home/dir/file.txt | awk "{print $2}" na while smyčka;

první Myslím, že správná cesta by měla být /home/dir/file.txt (je to však jen předpoklad);

druhý /home/dir/file.txt | awk "{print $2}" nepřesměruje obsah /home/dir/file.txt na awk , zatímco < /home/dir/file.txt awk "{print $2}" ano;

za třetí, přesměrováváte výstup příkazu jako soubor, ale jedná se o řetězec a měli byste jej přesměrovat jako it: <<< "$(< /home/dir/file.txt awk "{print $2}")".

Alternativně můžete výstup příkazu přesměrovat přímo do smyčky while místo toho: .

 while read num do if [ "$num" = "0" ]; then echo "Number is equal to zero" else echo "number is not equal to 0" fi done <<< "$(< /home/dir/file.txt awk "{print $2}")"  

nebo

 < /home/dir/file.txt awk "{print $2}" | while read num do if [ "$num" = "0" ]; then echo "Number is equal to zero" else echo "number is not equal to 0" fi done  

odpověď

Protože nemohu komentovat, jen se ptám, proč lidé nepoužívají IFS

 while IFS=" " read var num year string do if [[ $num -eq 0 ]]; then echo "Number is equal to zero" else echo "number is not equal to 0" fi done < home/dir/file.txt 

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *