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

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

106849_01373    106849_01967    106850_00082    23025.7_01059   

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

106849_01373
106849_01967
106850_00082
23025.7_01059

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

1
задан 21 March 2016 в 16:52

5 ответов

Довольно легко с 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
15
ответ дан 23 May 2018 в 12:42

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

perl -lane '$,="\n"; print(@F)' file.txt
-l: включает автоматическую обработку окончания строки. Он имеет два отдельных эффекта. Во-первых, он автоматически сжимает $ / (разделитель входных данных) при использовании с -n или -p. Во-вторых, он присваивает $ \ (разделителю выходной записи) значение octnum, так что в любых операторах печати будет добавлен этот разделитель. Если 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
2
ответ дан 23 May 2018 в 12:42

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
ответ дан 23 May 2018 в 12:42

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

sed -e 's/\s\{1,\}$//' -e 's/\s\+/\n/g' file.txt > split_file.txt
1
ответ дан 23 May 2018 в 12:42
  • 1
    Не совсем ... он добавит конечную новую строку после каждой (начальной) строки. – heemayl 21 March 2016 в 16:53
  • 2
    Проверьте с несколькими строками, тогда вы получите четкий случай. – heemayl 21 March 2016 в 16:57
  • 3
    Не могли бы вы добавить пример с вашим ответом. – heemayl 21 March 2016 в 16:58
  • 4
    @heemayl Вы имели в виду, что это превратит конечные пробелы в новые строки. Ваш синтаксис не позволяет легко понять. : / – techraf 21 March 2016 в 17:21

Я просто добавляю решение 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
1
ответ дан 23 May 2018 в 12:42

Другие вопросы по тегам:

Похожие вопросы: