Строки в столбец преобразования файла

15

Предположим, у меня есть файл:

File1:

PAPER  TEAM  MANISH NISHA GARIMA JYOUTI ........etc 

File2 Я хочу:

PAPER    
TEAM
MANISH
NISHA
GARIMA    
JYOUTI

Строки для преобразования столбцов File1.

Yisha
источник
Если ваш файл состоит из более чем одной строки и, следовательно, ваш вывод должен содержать более одного столбца, попробуйте этот сценарий AWK .
Приостановлено до дальнейшего уведомления.
Очень связанный вопрос: askubuntu.com/q/461144/295286
Сергей Колодяжный

Ответы:

20

Используя 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позиции с одинаковыми номерами полей и печатает результат, который будет первой строкой в ​​первом столбце, второй строкой во втором столбце и т. Д. Конечно, входной файл ограничен размером вашей памяти.

αғsнιη
источник
Я попытался с теми же данными и кодом, он напечатал последний столбец в качестве первой записи, например 4 d%, а затем 2-й записи 1 a # и так далее.
Абхинай
8

Вы можете просто сделать это через grep. По умолчанию grep выводит совпадение на отдельной строке.

grep -oP '\S+' infile > outfile

ИЛИ

grep -o '[^[:space:]]\+' infile > outfile
Авинаш Радж
источник
1
+1 за творческое использованиеgrep
Volker Siegel
8

Вы также можете использовать fmtкоманду:

~$ cat f
PAPER  TEAM  MANISH NISHA GARIMA JYOUTI
~$ fmt -1 f
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
fredtantini
источник
7

С GNU datamash :

$ datamash -W transpose <file
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
cuonglm
источник
datamashкажется лучшим инструментом для решения этой задачи, но интересно, сколько других инструментов можно использовать!
Марк Стюарт
6

Вы также можете сделать это используя sed:

$ sed -e 's/  */\n/g' file1 > file2

ПРИМЕЧАНИЕ. Не обрабатывает ситуацию, когда слова содержат пробелы.

SLM
источник
Это требует GNU sed, насколько я могу судить. Тот, который поставляется с Mac (BSD), не видит \nкак новую
строку
5

Используя awk, устанавливая поле вывода output ( OFS) в качестве разделителя записи (строки) ( RS):

awk '{OFS=RS;$1=$1}1' file > file2
jasonwryan
источник
2

Используя forцикл:

for val in `cat file1` ; do echo $val >> file2; done;
Мандар Шинде
источник
0

Вы также можете попробовать использовать sed

$ sed -i.bak s@' '@'\n'@g infile.txt

Обратите внимание, что я использую @в качестве разделителя для операции замещения. Это также создаст файл резервной копии. Если вам не нужна резервная копия, удалите .bak

$ sed -i s@' '@'\n'@g infile.txt
Вайбхав Шети
источник
0

Версия 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
Сергей Колодяжный
источник
0

Используя xargs, (украдено из ответа Суравца ):

xargs -n 1 < File1 > File2

Или, если требуется какое-либо незначительное переформатирование, используйте printfстроки формата так, как это может понадобиться:

xargs printf '%s\n' < File1 > File2
АРУ
источник
0

Мое решение будет:

#!/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
Saumyakanta Sahoo
источник
-1
awk '{for (i=1;i<=NF;i++) {print($i)}}' file > File2
Narmatha
источник