
Ich habe Daten mit 3 Feldern gesammelt. Ich möchte die Daten des 3. Felds in einer einzigen Zeile drucken. Dies sind die Daten, die ich erhalte.
$ cat file
1234 1234 dei_1/3,dei_2/3,dei_9/0,
dei_10/0,dei_8/4
2345 2345 dei_8/9,dei_5/6,dei_4/9
4244 4244 dei_0/9,dei_4/6,dei_4/1
4235 4235 dei_0/9,dei_4/6,dei_4/,de
i_9/7,dei_1/3,dei_2/3,dei_9/0
Erwartetes Ergebnis:
1234 1234 dei_1/3,dei_2/3,dei_9/0,dei_10/0,dei_8/4
2345 2345 dei_8/9,dei_5/6,dei_4/9
4244 4244 dei_0/9,dei_4/6,dei_4/1
4235 4235 dei_0/9,dei_4/6,dei_4/,dei_9/7,dei_1/3,dei_2/3,dei_9/0
Codes, die ich bisher habe
while read file; do if [[ $file == 1 ]]; then echo -n; fi; done
Antwort1
Das folgende Skript verbindet mit der vorherigen Zeile jede Zeile, die nicht mit zwei Zahlen beginnt:
$ awk -v ORS="" '$1~/^[0-9]+$/ && $2~/^[0-9]+$/ && NR>1{printf "\n"}1' file
1234 1234 dei_1/3,dei_2/3,dei_9/0,dei_10/0,dei_8/4
2345 2345 dei_8/9,dei_5/6,dei_4/9
4244 4244 dei_0/9,dei_4/6,dei_4/1
4235 4235 dei_0/9,dei_4/6,dei_4/,dei_9/7,dei_1/3,dei_2/3,dei_9/0
Dies hängt davon ab ORS
, dass (Ausgabedatensatztrennzeichen) auf eine leere Zeichenfolge zurückgesetzt wird. Die neue Zeile wird hinzugefügt, wenn die ersten beiden Felder Zahlen sind (und wenn es nicht die erste Zeile ist).
Antwort2
Kurzsed
Ansatz:
sed -E 'N; s/\n([^[:space:]]*,[^[:space:]]+)/\1/' file
Die Ausgabe:
1234 1234 dei_1/3,dei_2/3,dei_9/0,dei_10/0,dei_8/4
2345 2345 dei_8/9,dei_5/6,dei_4/9
4244 4244 dei_0/9,dei_4/6,dei_4/1
4235 4235 dei_0/9,dei_4/6,dei_4/,dei_9/7,dei_1/3,dei_2/3,dei_9/0
Antwort3
Ein paar Awk-Ansätze:
Speichert die letzte Zeile, die mit einer Ziffer beginnt, und hängt sie an, wenn die aktuelle Zeile nicht mit einer Ziffer beginnt.
awk '
/^[[:digit:]]/ {if (prev) print prev; prev=$0; next}
{prev = prev $0}
END {if (prev) print prev}
' file
Kehren Sie die Datei um. Wenn eine Zeile mit einer Nicht-Ziffer beginnt, lesen Sie die nächste Zeile und hängen Sie die vorherige Zeile an. Kehren Sie die Ergebnisse um. Ich gehe davon aus, dass ein Datensatz höchstens 1 Mal geteilt wird
tac file | awk '/^[^[:digit:]]/ {this = $0; getline; $0 = $0 this} 1' | tac