Перетворення рядків у стовпці файлу


15

Припустимо, у мене є файл:

Файл1:

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

Файл2 я хочу:

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 -W transpose <file
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI

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

6

Ви також можете це зробити, використовуючи sed:

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

ПРИМІТКА. Не обробляє ситуацію, коли слова містять пробіли.


Для цього потрібен GNU sed, якнайкраще, як я можу сказати. Той, що постачається з mac (BSD), не сприймає \nяк новий рядок
D. Ben Knoble,

5

Використовуючи awk, встановивши роздільник вихідного поля ( 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, (вкрадено з відповіді souravc ):

xargs -n 1 < File1 > File2

Або якщо потрібне незначне переформатування, використовуйте printfрядки формату, як це може знадобитися:

xargs printf '%s\n' < File1 > File2


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.