У меня есть .txt-файл с номерами, упорядоченными как это (в одной строке):
106849_01373 106849_01967 106850_00082 23025.7_01059
Я хотел бы их преобразовать так:
106849_01373
106849_01967
106850_00082
23025.7_01059
Я не знаю, какую команду использовать. Может ли кто-нибудь помочь мне с этим?
Довольно легко с 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 - это путь, но вот альтернатива, использующая 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
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
Использование sed:
sed -e 's/\s\{1,\}$//' -e 's/\s\+/\n/g' file.txt > split_file.txt
Я просто добавляю решение 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