Как конвертировать из строки в столбец?


11

У меня есть файл .txt с номерами, упорядоченными следующим образом (в той же строке):

106849_01373    106849_01967    106850_00082    23025.7_01059   

Я хотел бы преобразовать их так:

106849_01373
106849_01967
106850_00082
23025.7_01059

Я понятия не имею, какую команду использовать. Может ли кто-нибудь помочь мне с этим?

Ответы:


5

Вот один с xargs

xargs -n1 < file.txt

Демо-версия:

$ 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 - отличный инструмент, и если бы вы его не упомянули, я бы сказал, но у него есть один недостаток: если вы пропустите команду, она заменяет echo (что, в отличие от некоторых оболочек, xargs не имеет встроенного эха) и -n1 указывает xargs вызывать команду для каждого аргумента, поэтому в этом примере у вас будет минимум шесть процессов (оболочка для перенаправления io, xargs и четыре эха). Это не так уж плохо в этой области, но это заметно медленнее при выводе нескольких тысяч строк.
Хильдред

16

Довольно легко с tr:

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

Пример:

% 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

Ответ Heemayl - путь, однако есть альтернатива, использующая Perl:

perl -lane '$,="\n"; print(@F)' file.txt
  • -l: включает автоматическую обработку конца строки. У него есть два отдельных эффекта. Во-первых, он автоматически запускает $ / (разделитель входных записей) при использовании с -n или -p. Во-вторых, он присваивает $ \ (разделителю выходной записи) значение octnum, чтобы в любом операторе печати этот разделитель был добавлен обратно. Если октнум опущен, устанавливает $ \ текущее значение $ /.
  • -a: включает режим автоматического разделения при использовании с -n или -p. Неявная команда split для массива @F выполняется в качестве первой вещи внутри неявного цикла while, создаваемого -n или -p.
  • -n: заставляет Perl принять следующий цикл вокруг вашей программы, который заставляет его перебирать аргументы имени файла, вроде sed -n или awk:

    LINE:
      while (<>) {
          ...             # your program goes here
      }
  • -e: может использоваться для ввода одной строки программы;

  • $,="\n": устанавливает разделитель выходного поля на новую строку;
  • print(@F): печатает поля, разделенные разделителем выходных полей.
% 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

AWKподход. В основном изменение выходного разделителя для полей и циклов. Тестовый файл - ваш пример, вставленный снова и снова с ENDLINE в конце

$ 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

Использование sed:

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

Не совсем ... это добавит завершающий символ новой строки после каждой (начальной) строки ..
Heemayl

Сверьтесь с несколькими строками, тогда вы получите ясный случай ...
heemayl

Не могли бы вы добавить пример с вашим ответом ..
Heemayl

@heemayl Вы имели в виду, что это превратит конечные пробелы в новые строки. Ваш синтаксис не облегчает понимание. : /
techraf

1

Я просто добавляю решение Python для удовольствия:

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

Эта команда запускает однострочный скрипт Python 3 в «одинарных кавычках» с именем файла, который вы хотите преобразовать в качестве аргумента в конце. Синтаксис такой:

python3 -c 'PYTHON_COMMAND_OR_1-LINE-SCRIPT' ARGUMENTS

Сценарий, состоящий из 1 строки, который мы используем, для ясности расширен до нескольких строк:

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

Он импортирует sysмодуль для чтения аргументов командной строки, принимает первый заданный аргумент в качестве имени файла для открытия и печатает каждый разделенный пробелами фрагмент данных из файла в одну строку.

$ 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.