Wie konvertiere ich von Zeile zu Spalte?


10

Ich habe eine TXT-Datei mit folgenden Nummern (in derselben Zeile):

106849_01373    106849_01967    106850_00082    23025.7_01059   

Ich möchte sie so konvertieren:

106849_01373
106849_01967
106850_00082
23025.7_01059

Ich habe keine Ahnung, welchen Befehl ich verwenden soll. Kann mir jemand dabei helfen?

Antworten:


4

Hier ist eins mit xargs

xargs -n1 < file.txt

Demo:

$ cat file.txt                    
106849_01373    106849_01967    106850_00082    23025.7_01059 

$ xargs -n1 < file.txt
106849_01373
106849_01967
106850_00082
23025.7_01059

1
xargs ist ein großartiges Werkzeug, und wenn Sie es nicht erwähnt hätten, hätte ich es getan, aber es hat einen Nachteil darin, dass wenn Sie den Befehl weglassen, es das Echo ersetzt (was xargs im Gegensatz zu einigen Shells kein eingebautes Echo hat). und -n1 weist xargs an, den Befehl für jedes Argument aufzurufen. In diesem Beispiel wären also mindestens sechs Prozesse beteiligt (die Shell für die Io-Umleitung, xargs und vier Echos). Dies ist in diesem Bereich nicht so schlimm, aber bei einigen tausend Zeilen Ausgang messbar langsamer.
Hildred

15

Ziemlich einfach mit tr:

tr -s '[:blank:]' '\n' <file.txt

Beispiel:

% cat file.txt                    
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   

% tr -s '[:blank:]' '\n' <file.txt
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059

2

heemayls Antwort ist der richtige Weg, aber hier ist eine Alternative mit Perl:

perl -lane '$,="\n"; print(@F)' file.txt
  • -l: Aktiviert die automatische Zeilenendverarbeitung. Es hat zwei separate Effekte. Erstens wird bei Verwendung mit -n oder -p automatisch $ / (das Trennzeichen für Eingabedatensätze) geändert. Zweitens wird $ \ (das Trennzeichen für den Ausgabedatensatz) mit dem Wert octnum zugewiesen, sodass bei Druckanweisungen dieses Trennzeichen wieder hinzugefügt wird. Wenn octnum weggelassen wird, wird $ \ auf den aktuellen Wert von $ / gesetzt.
  • -a: Aktiviert den Autosplit-Modus, wenn er mit -n oder -p verwendet wird. Ein impliziter Split-Befehl für das @ F-Array wird als erstes in der impliziten while-Schleife ausgeführt, die von -n oder -p erzeugt wird.
  • -n: bewirkt, dass Perl die folgende Schleife um Ihr Programm annimmt, wodurch es über Dateinamenargumente wie sed -n oder awk iteriert:

    LINE:
      while (<>) {
          ...             # your program goes here
      }
  • -e: kann verwendet werden, um eine Programmzeile einzugeben;

  • $,="\n": setzt das Ausgabefeldtrennzeichen auf eine neue Zeile;
  • print(@F): Gibt die durch das Ausgabefeldtrennzeichen getrennten Felder aus.
% cat file.txt
106849_01373    106849_01967    106850_00082    23025.7_01059 
% perl -lane '$,="\n"; print(@F)' file.txt
106849_01373
106849_01967
106850_00082
23025.7_01059

1

AWKAnsatz. Grundsätzlich wird das Ausgabetrennzeichen für Felder geändert und eine Schleife erstellt. Die Testdatei ist Ihr Beispiel, das am Ende immer wieder mit ENDLINE eingefügt wird

$ awk 'BEGIN{OFS="\n"}{for(i=1;i<=NF;i++) print $i}' some_data 
106849_01373
106849_01967
106850_00082
23025.7_01059
ENDLINE
106849_01373
106849_01967
106850_00082
23025.7_01059
ENDLINE
106849_01373
106849_01967
106850_00082
23025.7_01059
ENDLINE

1

Verwenden von sed:

sed -e 's/\s\{1,\}$//' -e 's/\s\+/\n/g' file.txt > split_file.txt

Nicht ganz ... es würde nach jeder (anfänglichen) Zeile eine nachgestellte neue Zeile hinzufügen.
heemayl

Überprüfen Sie mit mehreren Zeilen, Sie würden dann einen klaren Fall bekommen ..
heemayl

Könnten Sie ein Beispiel mit Ihrer Antwort hinzufügen ..
heemayl

@heemayl Du meintest, es würde nachgestellte Leerzeichen in Zeilenumbrüche verwandeln. Ihre Syntax macht es nicht leicht zu verstehen. : /
Techraf

1

Ich füge nur zum Spaß eine Python-Lösung hinzu:

python3 -c 'import sys; f=open(sys.argv[1]); print(*f.read().split(),sep="\n")' mytestfile

Dieser Befehl führt das einzeilige Python 3-Skript in einfachen Anführungszeichen mit dem Dateinamen aus, den Sie am Ende als Argument konvertieren möchten. Die Syntax lautet wie folgt:

python3 -c 'PYTHON_COMMAND_OR_1-LINE-SCRIPT' ARGUMENTS

Das 1-Zeilen-Skript, das wir verwenden, ist das folgende (aus Gründen der Übersichtlichkeit auf mehrere Zeilen erweitert):

import sys
f=open(sys.argv[1])
print(*f.read().split(),sep="\n")

Es importiert das sysModul zum Lesen von Befehlszeilenargumenten, nimmt das erste angegebene Argument als Dateinamen zum Öffnen und druckt jeden durch Leerzeichen getrennten Datenblock aus der Datei in einer einzelnen Zeile.

$ cat mytestfile 
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   

$ python3 -c 'import sys; f=open(sys.argv[1]); print(*f.read().split(),sep="\n")' mytestfile
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.