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 sed
oder 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 -i
Schalter hinzu:
sed -i 's! \([^ ]\+\)\( \|$\)!\1 !g' your_file
Erläuterung
Dieser sed
Befehl 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 g
Modifikator am Ende angegeben wird. Im Grunde findet also eine Sequenz wie A B C
das Muster „ B “ und ersetzt es durch „B “, sodass Sie als Endergebnis sed
Folgendes 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 RS
auf „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