2013-05-06 6 views
5

Próbuję użyć awk, aby usunąć pierwsze trzy pola w pliku tekstowym. Usunięcie pierwszych trzech pól jest łatwe. Ale reszta linii zostanie pomieszane przez awk: separatory zmieniane są na karcie do przestrzeniUsuń pierwsze kolumny, a następnie pozostaw pozostałą linię nietkniętą w awk

Oto co próbowałem:

head pivot.threeb.tsv | awk 'BEGIN {IFS="\t"} {$1=$2=$3=""; print }' 

Pierwsze trzy kolumny zostały prawidłowo usunięte. Problem polega na tym, że dane wyjściowe kończą się zakładkami pomiędzy kolumnami 4 $ 5 $ 6 itd. Konwertowanymi na spacje.

+1

Nie ma zmienną o nazwie „IFS” w awk. shell ma IFS, awk ma FS. –

Odpowiedz

5

Najpierw, jak skomentował ED, musisz użyć FS jako separatora pól w awk. tab staje się space w wynikach, ponieważ nie zdefiniowano OFS.

awk 'BEGIN{FS=OFS="\t"}{$1=$2=$3="";print}' file 

spowoduje to usunięcie pierwszych 3 pól i pozostawienie tekstu pozostałego "nietkniętego" (zobaczysz pierwsze 3 zakładki). również na wyjściu zostanie zachowany kod <tab>.

awk 'BEGIN{FS=OFS="\t"}{print $4,$5,$6}' file 

wyświetli się bez wiodących spacji/zakładek. ale jeśli masz 500 kolumn, musisz to zrobić w pętli lub użyć funkcji sub lub rozważyć inne narzędzia, na przykład cięcie.

3

Jeśli nie chcesz oddzielenie pola zmieniona następnie użyć sed usunąć pierwsze 3 kolumny zamiast:

sed -r 's/(\S+\s+){3}//' file 

Aby zapisać zmiany z powrotem do pliku można użyć opcji -i:

sed -ri 's/(\S+\s+){3}//' file 
4

Właściwie można to zrobić w bardzo prosty polecenia cut tak:

cut -f4- inFile 
+0

Chciałbym, żeby nie było buforowane. – Nakilon

0
awk '{for (i=4; i<NF; i++) printf $i " "; print $NF}' 
+0

ten błąd kończy się niepowodzeniem, jeśli ostatnia kolumna zawiera podwójne spacje w nazwach –

+0

Nie można uzyskać oczekiwanych wyników, jeśli w każdej linii znajdują się mniej niż cztery pola. (Wypisze ostatni z nich zamiast usunąć wszystkie.) Zamiast tego możesz użyć: 'awk '{for (i = 4; i <= NF; i ++) printf $ i" "; printf "\ n"} "Lub dodaj dodatkową logikę, aby zapobiec końcowi miejsca. – Wildcard