Jak przekonwertować z wiersza na kolumnę?


11

Mam plik .txt z numerami uporządkowanymi w ten sposób (w tym samym wierszu):

106849_01373    106849_01967    106850_00082    23025.7_01059   

Chciałbym je przekonwertować w ten sposób:

106849_01373
106849_01967
106850_00082
23025.7_01059

Nie mam pojęcia, którego polecenia użyć. Czy ktoś może mi w tym pomóc?

Odpowiedzi:


5

Oto jeden z xargs

xargs -n1 < file.txt

Próbny:

$ 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 jest świetnym narzędziem, a jeśli nie wspomniałeś o tym, zrobiłbym to, ale ma jedną wadę polegającą na tym, że pominięcie polecenia zastępuje echo (które w przeciwieństwie do niektórych powłok, xargs nie ma wbudowanego echa) i -n1 mówi xargsowi, aby wywoływał polecenie dla każdego argumentu, więc w tym przykładzie miałbyś do czynienia z co najmniej sześcioma procesami (powłoka do przekierowania io, xargs i cztery echa). Nie jest to takie złe w tym zakresie, ale jest mierzalnie wolniejsze przy kilku tysiącach linii wyjściowych.
Hildred

16

Całkiem łatwe dzięki tr:

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

Przykład:

% 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

odpowiedź heemayl jest właściwą drogą, jednak oto alternatywa dla Perla:

perl -lane '$,="\n"; print(@F)' file.txt
  • -l: umożliwia automatyczne przetwarzanie końca linii. Ma dwa osobne efekty. Po pierwsze, automatycznie używa komendy $ / (separator rekordów wejściowych), gdy jest używana z -n lub -p. Po drugie, przypisuje $ \ (separator rekordu wyjściowego), aby miał wartość octnum, dzięki czemu wszelkie instrukcje drukowania będą miały ponownie dodany separator. Jeśli octnum zostanie pominięty, ustawia $ \ na bieżącą wartość $ /.
  • -a: włącza tryb automatycznego podziału, gdy jest używany z -n lub -p. Ujawnione polecenie podziału na tablicę @F jest wykonywane jako pierwsza rzecz w niejawnej pętli while generowanej przez -n lub -p.
  • -n: powoduje, że Perl zakłada następującą pętlę wokół twojego programu, co powoduje iterację argumentów nazw plików, takich jak sed -n lub awk:

    LINE:
      while (<>) {
          ...             # your program goes here
      }
  • -e: może być użyty do wprowadzenia jednego wiersza programu;

  • $,="\n": ustawia separator pola wyjściowego na nowy wiersz;
  • print(@F): drukuje pola oddzielone separatorem pól wyjściowych.
% 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

AWKpodejście. Zasadniczo zmiana separatora wyjściowego dla pól i zapętlanie. Plik testowy to twój przykład wklejany w kółko z ENDLINE na końcu

$ 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

Używanie sed:

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

Niezupełnie… dodawalibyśmy nową linię po każdej (początkowej) linii ..
heemayl

Sprawdź z wieloma wierszami, wtedy dostaniesz jasną sprawę ...
heemayl

Czy możesz dodać przykład z odpowiedzią ...
heemayl

@ heemayl Miałeś na myśli, że zmieni spacje końcowe w nowe linie. Twoja składnia nie ułatwia zrozumienia. : /
techraf

1

Po prostu dodaję rozwiązanie Python dla zabawy:

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

To polecenie uruchamia jednowierszowy skrypt Python 3 w „pojedynczych cudzysłowach” z nazwą pliku, który chcesz przekonwertować jako argument na końcu. Składnia jest następująca:

python3 -c 'PYTHON_COMMAND_OR_1-LINE-SCRIPT' ARGUMENTS

Skrypt 1-liniowy, którego używamy, jest następujący (rozszerzony do wielu linii dla zachowania przejrzystości):

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

Importuje sysmoduł w celu odczytania argumentów wiersza poleceń, przyjmuje pierwszy podany argument jako nazwę pliku i drukuje każdy fragment danych oddzielony spacjami z pliku w jednym wierszu.

$ 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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.