Gerade/ungerade Zeilen in neue Spalte drucken

Gerade/ungerade Zeilen in neue Spalte drucken

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 vimeinem 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).

sedist 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 edSkript 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 edwerden dann die ungeraden und geraden Zeilen verbinden. Für Ihre achtzeilige Beispieldatei würde die Schleife diese edBefehle erzeugen:

1,2j
2,3j
3,4j
4,5j

Der letzte echoBefehl weist lediglich an, eddie 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).

verwandte Informationen