Припустимо, у мене є файл:
Файл1:
PAPER TEAM MANISH NISHA GARIMA JYOUTI ........etc
Файл2 я хочу:
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
Перетворення рядків у стовпці File1.
Припустимо, у мене є файл:
Файл1:
PAPER TEAM MANISH NISHA GARIMA JYOUTI ........etc
Файл2 я хочу:
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 -W transpose <file
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
datamash
видається найкращим інструментом для виконання завдання, але захоплююче, скільки інших інструментів можна було б використати!
Ви також можете це зробити, використовуючи sed
:
$ sed -e 's/ */\n/g' file1 > file2
ПРИМІТКА. Не обробляє ситуацію, коли слова містять пробіли.
\n
як новий рядок
Використання 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
, (вкрадено з відповіді souravc ):
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