Як перетворити з рядка в стовпчик?


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 - це чудовий інструмент, і якби ви цього не згадували, я б мав, але у нього є один недолік у тому, що якщо ви опустите команду, вона замінює ехо (що на відміну від деяких оболонок, xargs не має вбудованого відлуння) і -n1 вказує xargs викликати команду для кожного аргументу, тож у цьому прикладі у вас буде щонайменше шість процесів (оболонка для перенаправлення io, xargs та чотири відлуння). Це не так вже й погано в цьому масштабі, але воно вимірюється повільніше при виході в пару тисяч рядків.
hildred

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, щоб будь-які оператори друку знову додавали цей роздільник. Якщо octnum опущено, встановлює $ \ поточне значення $ /.
  • -a: увімкнює режим автошпліту при використанні з -n або -p. Неявна розділена команда для масиву @F виконується як перше, що знаходиться всередині неявного циклу в той час, як цикл виробляється -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.