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

10

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

106849_01373    106849_01967    106850_00082    23025.7_01059   

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

106849_01373
106849_01967
106850_00082
23025.7_01059

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

    
задан Annemieke Smet 21.03.2016 в 12:43
источник

6 ответов

4

Вот один из 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
    
ответ дан souravc 21.03.2016 в 14:46
источник
14

Довольно легко с 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
    
ответ дан heemayl 21.03.2016 в 12:49
2

Ответ 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
    
ответ дан kos 21.03.2016 в 13:24
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
    
ответ дан Sergiy Kolodyazhnyy 21.03.2016 в 13:13
1

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

sed -e 's/\s\{1,\}$//' -e 's/\s\+/\n/g' file.txt > split_file.txt
    
ответ дан techraf 21.03.2016 в 12:52
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
    
ответ дан Byte Commander 21.03.2016 в 14:18