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ć.

Marcus Thornton
źródło

Odpowiedzi:

35

Możesz to zrobić w następujący sposób:

awk '$35=$35"$"'
Cuonglm
źródło
8

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

awk '{$35 = $35"$"; print}' infile > outfile
jasonwryan
źródło
3

Jeśli separatorem pola jest <space>:

sed 's/  */$&/35'
mikeserv
źródło
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.

Zee
źródło
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ć
Jason G.
źródło
awk '$1=mktime($1)' FS=, OFS=, oldfile > newfile ... zastąpił milion znaczników czasu w kilka sekund !! :)
roblogic,