Druckfeld 'n' bis zum Ende der Linie
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.
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.