У меня есть .txt файл с числами, заказанными как это (на той же строке):
106849_01373 106849_01967 106850_00082 23025.7_01059
Я хотел бы преобразовать их как этот:
106849_01373
106849_01967
106850_00082
23025.7_01059
Я понятия не имею который команда использовать. Кто-то может помочь мне с этим?
Вот один с 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
Довольно легкий с 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. Неявная команда разделения к массиву @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
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