2011-10-21 16 views

Odpowiedz

22

try:

awk 'FNR==NR{a[NR]=$3;next}{$2=a[FNR]}1' f2 f1 

wyjściowa:

111 000 444 
222 111 555 
333 555 666 

Wyjaśnienie powyższego kodu:

  • FNR==NR wszystko możesz pracować z jednym całym plikiem na raz. W tym przypadku jest to plik f2. NR i FNR zawierają numery wierszy z różnicą: FNR zostanie zresetowane do 1, gdy zostanie odczytany nowy plik, gdzie jako NR nadal rośnie.
  • Gdy pracujemy z f2 pliku, że tworzą tablicę nazwie a pomocą liczby linii (NR) jako kolumny key i trzeci ($3) jako wartość. next pozwala nam pominąć resztę bloku akcji.
  • Po zakończeniu pliku f2 zaczynamy pracę nad plikiem f1. NR==FNR warunek nie zostanie zmieniony na false, ponieważ FNR będzie wzrastał od 1, a NR nie. Tak więc będzie pracował tylko drugi blok działania {$2=a[FNR]}.
  • To, co robi ten blok, powoduje ponowne przypisanie wartości drugiej kolumny do wartości tablicy poprzez wyszukanie numeru wiersza.
  • 1 na końcu drukuje linię. Zwraca true, a w awk prawdziwe instrukcje powodują drukowanie linii.
  • f2 f1 to kolejność zdefiniowanych plików. Ponieważ chcemy utworzyć tablicę z pliku f2, wstawiamy ją jako pierwszą.
+1

Proszę wyjaśnić polecenie. Dzięki – saloua

+0

@sououa dodałam wyjaśnienie. Mam nadzieję, że pomaga! –

+1

Mój przypadek użycia jest bardzo nieznacznie inny (tylko nieznacznie). Różnica polega na tym, że zamiast ograniczonego miejsca miałem plik rozdzielany przecinkami dla f1 i f2. Próbowałem tego samego polecenia z opcją '-F,', ale plik wyjściowy nie miał w tym przypadku przecinka. Jakikolwiek sposób to naprawić? – Ganesh

Powiązane problemy