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


15

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

File1:

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

File2 Я хочу:

PAPER    
TEAM
MANISH
NISHA
GARIMA    
JYOUTI

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


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


Я попытался с теми же данными и кодом, он напечатал последний столбец в качестве первой записи, например 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

7

С GNU datamash :

$ datamash -W transpose <file
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI

datamashкажется лучшим инструментом для решения этой задачи, но интересно, сколько других инструментов можно использовать!
Марк Стюарт

6

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

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

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


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

5

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

awk '{OFS=RS;$1=$1}1' file > file2


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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.