Frage

Ich möchte Hilfe oder Anweisung zu einem Problem haben, das ich in awk habe.

Ich habe eine Tabulaturdatei mit mehr als 5 Feldern. Ich möchte die Felder ohne die ersten 5 Felder ausgeben.

Könnten Sie bitte sagen, wie Sie ein awk -Skript schreiben, um diese Aufgabe zu erfüllen?

Am besten, Jianfeng.mao

Beachten Sie den folgenden Kommentar:

Es gibt viele Felder in meinen Dateien. Unterschiedliche Linien haben eine andere Anzahl von Feldern. Die Anzahl der Felder pro Zeile ist nicht Standard.

War es hilfreich?

Lösung

Ich stimme dem Vorschlag von Matchew zur Verwendung zu cut: Es ist das richtige Werkzeug für diesen Job. Aber wenn dies nur ein Teil eines größeren wird awk Skript, hier ist wie es geht:

awk -F "\t" '{ for (i=6; i<=NF; ++i) $(i-5) = $i; NF = NF-5; print; }

Andere Tipps

In meiner Registerkarte Abgrenzte Datei temp.txt Es sieht aus wie die folgenden

Field1 Field2 Field3 Field4 Field5 Field6 6
Field1 Field2 Field3 Field4 Field5 Field6 Field7
FELD1 FIELD2 FIELD3 FIELD4 FIELD5 FIELD6 FIELD7 FIELD 8

Nach Ihrem Update empfehle ich dringend die Verwendung cut:

cut -f6- temp.txt

druckt das Feld 6 bis zum Ende der Linie.

Notiz -d Gibt den Trennzeichen an, aber die Registerkarte ist der Standard -Trennzeichen. Sie können dies in tun awk, aber ich finde cut einfacher sein.

Mit awk Es würde so aussehen:

 awk '{print substr($0, index($0, $6))}' temp.txt

Wenn meine Registerkarte die Datei temp.txt abgrenzt

Field1 Field2 Field3 Field4 Field5 Field6 6
Field1 Field2 Field3 Field4 Field5 Field6 Field7
FELD1 FIELD2 FIELD3 FIELD4 FIELD5 FIELD6 FIELD7 FIELD 8

awk -F"\t" '{print $6}' temp.txt

druckt nur das 6. Feld. Wenn der Trennzeichen die Registerkarte ist, funktioniert er wahrscheinlich ohne festzulegen -F, aber ich mag es, meinen Field -Separator zu setzen, wenn ich kann.

Ebenso würde es auch schneiden.

cut -f6 temp.txt

Ich habe eine Ahnung, dass Ihre Frage etwas komplizierter ist als dies. Wenn Sie also auf meinen Kommentar antworten, kann ich versuchen, meine Antwort zu erweitern.

Perl Weg?

perl -lane 'splice @F,0,5;print "@F"'

Also,

echo 'field1 field2 field3 field4 field5 field6' | perl -lane 'splice @F,0,5;print "@F"'

wird herstellen

field6
awk -vFS='\t' -vOFS='\t' '{
  $1=$2=$3=$4=$5=""
  print substr($0,6) # delete leading tabs
}'

ich benutze -vFS='\t' statt -F'\t' Weil einige Implementierungen von awk (z. B. Busybox) nicht in der letzteren Konstruktion entkommen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top