Jak zamienić zawartość określonej kolumny na awk?


31

Biorąc pod uwagę: w rekordzie znajduje się 40 kolumn. Chcę zastąpić 35. kolumnę, aby 35. kolumna została zastąpiona treścią 35. kolumny i symbolem „$”. Przyszło mi do głowy coś takiego:

awk '{print $1" "$2" "...$35"$ "$36...$40}'

Działa, ale ponieważ jest to niewykonalne, gdy liczba kolumn wynosi aż 10 000. Potrzebuję lepszego sposobu, aby to zrobić.

Odpowiedzi:



8

Prawdopodobnie istnieją na to bardziej wydajne sposoby. Z tym zastrzeżeniem:

awk '{$35 = $35"$"; print}' infile > outfile

3

Jeśli separatorem pola jest <space>:

sed 's/  */$&/35'

Jeśli ogranicznik pola jest nieznany:sed 's/./$&/35'
Podważ

@Underverse - nie sądzę, że to to samo. Powinno to poprzedzać 35. znak w linii wejściowej w / w znaku $- rozdzielanym lub nie. Powyższe powinno umieszczać 35. wystąpienie dowolnej liczby znaków ogranicznika - innymi słowy 35. pole - z char $- bez względu na to, jak znaki są w każdym polu.
mikeserv

Ach, „40 kolumn w rekordzie”. Przeczytałem „35. kolumnę” jako dosłownie „35. kolumnę znaków w pliku tekstowym”.
Podważ

3

Zrobiłem to, aby zarezerwować oryginalny separator pola. Kolumna, którą chciałem wygasić, miała numer 12 USD.

awk -F"\t" '{OFS=FS}{ $12="" ; print   }' infile.txt > outfile.txt

Za pomocą gawk -i, jeśli go masz, możesz edytować plik na miejscu.


1

Gdyby wystąpiły problemy z użyciem „zatwierdzonych” odpowiedzi, zastąpiłoby to więcej niż tylko pierwszą kolumnę w pliku. Używam tego ogólnego polecenia:

awk '$[column]="[replace]"' FS=, OFS=, inputfile > outputfile

Gdzie:

  • [column] = kolumna, którą chcesz zmienić, zaczynając od 1 (nie 0)
  • [replace] = tekst, który chcesz zastąpić

awk '$1=mktime($1)' FS=, OFS=, oldfile > newfile ... zastąpił milion znaczników czasu w kilka sekund !! :)
roblogic,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.