Wie druckt man in Bash eine Zeile mithilfe eines Trennzeichens in einer einzigen Zeile?

Wie druckt man in Bash eine Zeile mithilfe eines Trennzeichens in einer einzigen Zeile?

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

KurzsedAnsatz:

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

verwandte Informationen