Ich habe eine Datei mit X Zeilen in einer einzelnen Spalte und möchte jede Zeile mit gerader/ungerader Nummer in eine neue Spalte drucken. Ist dies unter Linux oder in vim
einem Editor möglich?
Zum Beispiel:
Eingabedatei:
RESOLUTION: 1.70
UNIT: MONOMERIC
RESOLUTION: 1.80
UNIT: DIMERIC
RESOLUTION: 2.50
UNIT: TRIMERIC
RESOLUTION: 2.20
UNIT: TETRAMERIC
Ausgabedatei, die ich brauche:
RESOLUTION: 1.70 UNIT: MONOMERIC
RESOLUTION: 1.80 UNIT: DIMERIC
RESOLUTION: 2.50 UNIT: TRIMERIC
RESOLUTION: 2.20 UNIT: TETRAMERIC
Antwort1
Versuchen Sie es unten.
$cat a.txt
RESOLUTION: 1.70
UNIT: MONOMERIC
RESOLUTION: 1.80
UNIT: DIMERIC
RESOLUTION: 2.50
UNIT: TRIMERIC
RESOLUTION: 2.20
UNIT: TETRAMERIC
$ cat a.txt | sed 'N;s/\n/ /g'
RESOLUTION: 1.70 UNIT: MONOMERIC
RESOLUTION: 1.80 UNIT: DIMERIC
RESOLUTION: 2.50 UNIT: TRIMERIC
RESOLUTION: 2.20 UNIT: TETRAMERIC
Antwort2
Angenommen, die Daten befinden sich in der Datei z1, dann
paste -sd "\t\n" z1
wird herstellen:
RESOLUTION: 1.70 UNIT: MONOMERIC
RESOLUTION: 1.80 UNIT: DIMERIC
RESOLUTION: 2.50 UNIT: TRIMERIC
RESOLUTION: 2.20 UNIT: TETRAMERIC
Auf einem System wie:
OS, ker|rel, machine: Linux, 3.16.0-7-amd64, x86_64
Distribution : Debian 8.11 (jessie)
bash GNU bash 4.3.30
paste (GNU coreutils) 8.23
Schöne Grüße ... Prost, drl
Antwort3
Sie suchen an der richtigen Stelle (awk oder sed).
sed
ist ausreichend, wenn gnu verwendet wird sed
.
sehenhttps://www.gnu.org/software/sed/manual/sed.html#Numeric-Addresses
4.2 Zeilen nach Zahlen auswählen
…
first~step Diese GNU-Erweiterung passt zu jeder step-ten Zeile, beginnend mit Zeile first. Insbesondere werden Zeilen ausgewählt, wenn ein nicht-negatives n existiert, sodass die aktuelle Zeilennummer gleich first + (n * step) ist. So würde man 1~2 verwenden, um die ungeraden Zeilen auszuwählen und 0~2 für gerade Zeilen; um jede dritte Zeile auszuwählen, beginnend mit der zweiten, würde '2~3' verwendet; um jede fünfte Zeile auszuwählen, beginnend mit der zehnten, würde '10~5' verwendet; und '50~0' ist nur eine obskure Art, 50 zu sagen.
Die folgenden Befehle demonstrieren die Verwendung der Schrittadresse:
$ seq 10 | sed -n '0~4p' 4 8
$ seq 10 | sed -n '1~3p' 1 4 7 10
Antwort4
Wenn Sie am Ende der ungeraden Zeilen ein Leerzeichen haben, können Sie ein ed
Skript schreiben:
{ for((line=1; line <= $(wc -l < input) / 2; line++)); do printf '%d,%dj\n' "$line" "$((line + 1))"; done; echo "wq"; } | ed -s input
Neu formatiert:
{ for((line=1; line <= $(wc -l < input) / 2; line++))
do
printf '%d,%dj\n' "$line" "$((line + 1))"
done
echo "wq"
} | ed -s input
Die Grundidee besteht darin, die Anzahl der Zeilen zu berechnen und diese durch zwei zu teilen. Die Druckbefehle ed
werden dann die ungeraden und geraden Zeilen verbinden. Für Ihre achtzeilige Beispieldatei würde die Schleife diese ed
Befehle erzeugen:
1,2j
2,3j
3,4j
4,5j
Der letzte echo
Befehl weist lediglich an, ed
die Datei auf die Festplatte zu schreiben und das Programm zu beenden (exit).
Diese Methode fügt keine Leerzeichen zwischen den angrenzenden Zeilen ein. Wenn Sie also beispielsweise einen Tabulator hinzufügen müssen, müssen Sie diesen einfügen, indem Sie vor dem vorhandenen die folgende Zeile einfügen printf
:
printf '%ds/$/ /\n' "$line"
wobei das Leerzeichen, das Sie im Ersetzungstext sehen, ein Tabulator ist (geben Sie es mit Control-V, ein TAB).