Предположим, у меня есть файл:
File1:
PAPER TEAM MANISH NISHA GARIMA JYOUTI ........etc
File2 Я хочу:
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
Строки для преобразования столбцов File1.
Предположим, у меня есть файл:
File1:
PAPER TEAM MANISH NISHA GARIMA JYOUTI ........etc
File2 Я хочу:
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
Строки для преобразования столбцов File1.
Ответы:
Используя tr
, замените каждый повторяющийся символ пробела ( ) одним
\n
символом новой строки ( ).
tr -s ' ' '\n'< infile > outfile
1 2 3 4 1 a # abcd -> 2 b $ # $ @% 3 c @ 4 д%
С awk
нами можно сделать:
awk '{ for (i=1; i<=NF; i++) RtoC[i]= (RtoC[i]? RtoC[i] FS $i: $i) }
END{ for (i in RtoC) print RtoC[i] }' infile
Это объединяет все END
позиции с одинаковыми номерами полей и печатает результат, который будет первой строкой в первом столбце, второй строкой во втором столбце и т. Д. Конечно, входной файл ограничен размером вашей памяти.
Вы можете просто сделать это через grep. По умолчанию grep выводит совпадение на отдельной строке.
grep -oP '\S+' infile > outfile
ИЛИ
grep -o '[^[:space:]]\+' infile > outfile
grep
Вы также можете использовать fmt
команду:
~$ cat f
PAPER TEAM MANISH NISHA GARIMA JYOUTI
~$ fmt -1 f
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
С GNU datamash :
$ datamash -W transpose <file
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
datamash
кажется лучшим инструментом для решения этой задачи, но интересно, сколько других инструментов можно использовать!
Используя awk
, устанавливая поле вывода output ( OFS
) в качестве разделителя записи (строки) ( RS
):
awk '{OFS=RS;$1=$1}1' file > file2
Используя for
цикл:
for val in `cat file1` ; do echo $val >> file2; done;
Вы также можете попробовать использовать sed
$ sed -i.bak s@' '@'\n'@g infile.txt
Обратите внимание, что я использую @
в качестве разделителя для операции замещения. Это также создаст файл резервной копии. Если вам не нужна резервная копия, удалите .bak
$ sed -i s@' '@'\n'@g infile.txt
Версия Python:
python -c "import sys;lines=[l.replace(' ','\n') for l in sys.stdin.readlines()];print(''.join(lines))" < input.txt > output.txt
Это использует <
перенаправление в stdin Python от input.txt
и пишет с output.txt
использованием >
перенаправления. stdin
Однострочная строка сама читает все строки из списка строк, где все пробелы заменяются символами новой строки, и мы перестраиваем весь текст, используя .join()
функцию.
Альтернативный подход, позволяющий избежать замены нескольких пробелов в .split()
строке на новую строку, состоит в том, чтобы разбить строку на список слов. Таким образом, мы можем гарантировать, что каждое слово отделено только одной новой строкой
python -c "import sys;lines=['\n'.join(l.strip().split()) for l in sys.stdin.readlines()];print('\n'.join(lines))" < input.txt > output.txt
Используя xargs
, (украдено из ответа Суравца ):
xargs -n 1 < File1 > File2
Или, если требуется какое-либо незначительное переформатирование, используйте printf
строки формата так, как это может понадобиться:
xargs printf '%s\n' < File1 > File2
Мое решение будет:
#!/bin/bash
cols=$(head -1 file.txt | wc -w)
for i in $(seq 1 $cols); do
cut -d ' ' -f$i file.txt | tr '\n' ' ' | sed s'/.$//'
echo
done