Odpowiedzi:
... lub prostsze rozwiązanie: cut -f 3- INPUTFILE
po prostu dodaj właściwy separator (-d) i uzyskasz ten sam efekt.
awk '{for(i=3;i<=NF;++i)print $i}'
awk '{for(i=3;i<=NF;++i)printf $i""FS ; print ""}'
( printf
nie wydrukuje znaku nowej linii, podczas gdy print ""
doda znak nowej linii po wydrukowaniu innych pól)
echo $(seq 1 10) | awk '{for (i=3; i<=NF; i++) printf $i FS}'
, co daje: 3 4 5 6 7 8 9 10
.
awk '{ print substr($0, index($0,$3)) }'
rozwiązanie znalezione tutaj:
http://www.linuxquestions.org/questions/linux-newbie-8/awk-print-field-to-end-and-character-count-179078/
Odpowiedź Jonathana Feinberga drukuje każde pole w oddzielnym wierszu. Możesz użyć printf
do odbudowania rekordu do wyjścia w tym samym wierszu, ale możesz też po prostu przesunąć pola o skok w lewo.
awk '{for (i=1; i<=NF-2; i++) $i = $(i+2); NF-=2; print}' logfile
NF
nie jest dozwolona przez POSIX.
NF
można go zmniejszyć.
awk '{$1=$2=$3=""}1' file
Uwaga: ta metoda pozostawi "puste miejsca" w polach 1, 2, 3, ale nie stanowi problemu, jeśli chcesz tylko spojrzeć na wynik.
1
oznacza? które słowo kluczowe powinienem wyszukiwać awk
?
{$1=$2=$3="";$0=$0;$1=$1}1
Jeśli chcesz wydrukować kolumny po trzeciej, na przykład w tym samym wierszu, możesz użyć:
awk '{for(i=3; i<=NF; ++i) printf "%s ", $i; print ""}'
Na przykład:
Mar 09:39 20180301_123131.jpg
Mar 13:28 20180301_124304.jpg
Mar 13:35 20180301_124358.jpg
Feb 09:45 Cisco_WebEx_Add-On.dmg
Feb 12:49 Docker.dmg
Feb 09:04 Grammarly.dmg
Feb 09:20 Payslip 10459 %2828-02-2018%29.pdf
Wydrukuje:
20180301_123131.jpg
20180301_124304.jpg
20180301_124358.jpg
Cisco_WebEx_Add-On.dmg
Docker.dmg
Grammarly.dmg
Payslip 10459 %2828-02-2018%29.pdf
Jak widać, odcinek wypłaty, nawet ze spacją, jest wyświetlany we właściwej linii.
awk -v m="\x0a" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'
To odcina to, co znajduje się przed danym polem nr., N i wypisuje całą resztę wiersza, łącznie z polem nr N i zachowując oryginalne odstępy (nie zmienia formatowania). Nie ma znaczenia, czy ciąg pola pojawia się również gdzie indziej w wierszu, co jest problemem z odpowiedzią daisaa.
Zdefiniuj funkcję:
fromField () {
awk -v m="\x0a" -v N="$1" '{$N=m$N; print substr($0,index($0,m)+1)}'
}
I użyj tego w ten sposób:
$ echo " bat bi iru lau bost " | fromField 3
iru lau bost
$ echo " bat bi iru lau bost " | fromField 2
bi iru lau bost
Dane wyjściowe zachowują wszystko, w tym spacje końcowe
Działa dobrze w przypadku plików, w których „/ n” jest separatorem rekordów, więc nie ma znaku nowego wiersza w wierszach. Jeśli chcesz go używać z innymi separatorami rekordów, użyj:
awk -v m="\x01" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'
na przykład. Działa dobrze z prawie wszystkimi plikami, o ile nie używają szesnastkowego znaku nr. 1 wewnątrz linii.
Następujące polecenie awk drukuje N ostatnich pól każdego wiersza, a na końcu wiersza drukuje znak nowego wiersza:
awk '{for( i=6; i<=NF; i++ ){printf( "%s ", $i )}; printf( "\n"); }'
Znajdź poniżej przykład, który wymienia zawartość katalogu / usr / bin, a następnie przechowuje ostatnie 3 wiersze, a następnie wypisuje ostatnie 4 kolumny każdego wiersza przy użyciu awk:
$ ls -ltr /usr/bin/ | tail -3
-rwxr-xr-x 1 root root 14736 Jan 14 2014 bcomps
-rwxr-xr-x 1 root root 10480 Jan 14 2014 acyclic
-rwxr-xr-x 1 root root 35868448 May 22 2014 skype
$ ls -ltr /usr/bin/ | tail -3 | awk '{for( i=6; i<=NF; i++ ){printf( "%s ", $i )}; printf( "\n"); }'
Jan 14 2014 bcomps
Jan 14 2014 acyclic
May 22 2014 skype
Cóż, możesz łatwo osiągnąć ten sam efekt, używając wyrażenia regularnego. Zakładając, że separator jest spacją, wyglądałoby to tak:
awk '{ sub(/[^ ]+ +[^ ]+ +/, ""); print }'
awk '{ sub(/([^ ]+ +){2}/, ""); print }'
co dwa razy usuwa wzór.
Rozwiązanie Perl:
perl -lane 'splice @F,0,2; print join " ",@F' file
Używane są następujące opcje wiersza polecenia:
-n
pętla wokół każdego wiersza pliku wejściowego, nie drukuj automatycznie każdego wiersza
-l
usuwa nowe wiersze przed przetworzeniem i dodaje je później
-a
tryb autosplit - dzielenie linii wejściowych na tablicę @F. Domyślnie dzielenie na białe znaki
-e
wykonać kod perla
splice @F,0,2
czysto usuwa kolumny 0 i 1 z tablicy @F
join " ",@F
łączy elementy tablicy @F, używając spacji między każdym elementem
Jeśli plik wejściowy jest rozdzielany przecinkami, a nie spacjami, użyj -F, -lane
Rozwiązanie w Pythonie:
python -c "import sys;[sys.stdout.write(' '.join(line.split()[2:]) + '\n') for line in sys.stdin]" < file
awk '{for (i=4; i<=NF; i++)printf("%c", $i); printf("\n");}'
drukuje rekordy począwszy od czwartego pola do ostatniego pola w tej samej kolejności, w jakiej znajdowały się w oryginalnym pliku
W Bash możesz użyć następującej składni z parametrami pozycyjnymi:
while read -a cols; do echo ${cols[@]:2}; done < file.txt
Dowiedz się więcej: Obsługa parametrów pozycyjnych na stronie Bash Hackers Wiki
W kolumnach AWK nazywane są polami, stąd kluczem jest NF
wszystkie rzędy:
awk -F '<column separator>' '{print $(NF-2)}' <filename>
tylko pierwszy rząd:
awk -F '<column separator>' 'NR<=1{print $(NF-2)}' <filename>