Verbinde jede zweite Spalte mit sed oder awk

Verbinde jede zweite Spalte mit sed oder awk

Ich habe eine große Textdatei (666000 Spalten) im Format

A B C D E F

Gewünschte Ausgabe

AB CD EF

Wie können wir das in sedoder machen awk? Ich habe ein paar Dinge probiert, aber nichts scheint zu funktionieren. Bitte schlagen Sie etwas vor.

Antwort1

In sed:

sed 's! \([^ ]\+\)\( \|$\)!\1 !g' your_file

Dadurch werden die Ersetzungen vorgenommen und das Ergebnis auf Standardausgabe gedruckt. Um die Datei an Ort und Stelle zu ändern, fügen Sie den -iSchalter hinzu:

sed -i 's! \([^ ]\+\)\( \|$\)!\1 !g' your_file

Erläuterung

Dieser sedBefehl sucht nach einem Leerzeichen, gefolgt von mindestens einem Nicht-Leerzeichen, gefolgt von einem Leerzeichen oder dem Zeilenende. Er ersetzt diese Sequenz durch alle gefundenen Nicht-Leerzeichen, gefolgt von einem einzelnen Leerzeichen. Die Ersetzung wird so oft wie möglich über die Zeile hinweg angewendet (dies wird als globale Ersetzung bezeichnet), da der gModifikator am Ende angegeben wird. Im Grunde findet also eine Sequenz wie A B Cdas Muster „ B “ und ersetzt es durch „B “, sodass Sie als Endergebnis sedFolgendes erhalten .AB C

Annahmen, die dieser Code macht

Dieser Code geht davon aus, dass die Leerzeichen zwischen Ihren Spalten tatsächlich Leerzeichen und nicht z. B. TABs sind. Dies kann auf Kosten der Lesbarkeit leicht behoben werden:

sed 's![[:blank:]]\+\([^[:blank:]]\+\)\([[:blank:]]\+\|$\)!\1 !g' your_file

Antwort2

  • awk:

    awk '{printf $1$2;for(i=3; i<=NF;i+=2){printf " %s",$i$(i+1)}print}' file 
    

    Bei großen Dateien ist dies wahrscheinlich die schnellere der beiden Möglichkeiten.

  • Perl:

    perl -pe 's/([^\s]+)\s+([^\s]+)/$1$2/g' file
    

Antwort3

Wenn Ihre Datei tatsächlich so viele Spalten hat, können Sie gawk verwenden, um jede Spalte als Datensatz zu behandeln, indem Sie sie RSauf „ein oder mehrere Leerzeichen“ setzen. Dadurch wird vermieden, dass Sie eine Schleife durch die Spalten einrichten müssen. Beachten Sie, dass diese Lösung bei einer ungeraden Anzahl von Spalten in einer Zeile instabil ist.

awk --re-interval -v RS='[[:space:]]{1,}' '{x=$0; getline; printf x$0RT}' file

verwandte Informationen