it-swarm.com.de

Wie drucke ich die letzten 5 Felder in awk aus?

Ich habe 10 Felder und möchte von Feld 5 bis Feld 10 beginnen und die ersten 5 Felder ignorieren. Wie kann ich NF in awk verwenden, um das zu tun?

f1 f2 f3 f4 f5 f6 f7 f8 f9 f10
c1 c2 c3 c4 c5 c6 c7 c8 c9 c10

Ich möchte nur zeigen:

f6 f7 f8 f9 f10
c6 c7 c8 c9 c10
6
ASAD

Sie müssen die Felder durchlaufen:

bash-4.3$ awk '{for(i=6;i<=NF;i++) printf $i" "; print ""}' input_file.txt 
f6 f7 f8 f9 f10 
c6 c7 c8 c9 c10 

Oder Sie können Felder auf Null setzen:

bash-4.3$ awk '{for(i=1;i<=5;i++) $i="";print}' input_file.txt 
     f6 f7 f8 f9 f10
     c6 c7 c8 c9 c10

Oder verwenden Sie die Teilzeichenfolge der gesamten Zeile, um alle Zeichen zu drucken, ab denen Feld 6 beginnt (Gutschrift auf https://stackoverflow.com/a/12900372/3701431 ):

bash-4.3$ awk '{print substr($0,index($0,$6))}' input_file.txt 
f6 f7 f8 f9 f10
c6 c7 c8 c9 c10

oder verwenden Sie einfach den Befehl cut:

bash-4.3$ cut -d " " -f6-10  input_file.txt 
f6 f7 f8 f9 f10
c6 c7 c8 c9 c10

Python kann das auch:

bash-4.3$ python -c 'import sys;fields=[" ".join(line.strip().split()[5:]) for line in sys.stdin];print "\n".join(fields)' < input_file.txt 
f6 f7 f8 f9 f10
c6 c7 c8 c9 c10

oder alternativ:

$ python -c "import sys;print '\n'.join(map(lambda x:' '.join(x.split()[5:]),sys.stdin.readlines()))" < input_file.txt
f6 f7 f8 f9 f10
c6 c7 c8 c9 c10

Oder mit Ruby:

bash-4.3$ Ruby -ne 'print $_.split()[5..10].join(" ");print "\n"' < input_file.txt 
f6 f7 f8 f9 f10
c6 c7 c8 c9 c10

Bash + Xargs können das auch, wenn auch etwas komplizierter:

bash-4.3$ cat input_file.txt | xargs -L 1 bash -c 'arr=([email protected]);for i in $(seq 5 10);do printf "%s " ${arr[$i]} ; done; echo' sh
f6 f7 f8 f9 f10  
c6 c7 c8 c9 c10 
7

Bearbeiten Sie einfach die Interessengebiete. Das ist das letzte Feld -4, das letzte Feld -3 bis zum letzten Feld.

Lesen aus einer Datei mit diesem Inhalt (file.txt):

f1 f2 f3 f4 f5 f6 f7 f8 f9 f10
c1 c2 c3 c4 c5 c6 c7 c8 c9 c10

Führen Sie awk für die Datei aus, wie unten beschrieben. Die Zeile mit dem Zeichen $ ist der Befehl. Die letzten beiden Zeilen sind die Ausgabe.

$ awk '{print $(NF-4)" "$(NF-3)" "$(NF-2)" "$(NF-1)" "$NF}' file.txt
f6 f7 f8 f9 f10
c6 c7 c8 c9 c10

Anmerkung: Wie Cyrus im Kommentar betonte, habe ich das Bash-Skript entfernt und nur die print-Anweisung belassen, um es einfacher und schneller zu machen.

3
L. D. James