Wiersze do konwersji pliku do kolumny

15

Załóżmy, że mam plik:

Plik 1:

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

File2 Chcę:

PAPER    
TEAM
MANISH
NISHA
GARIMA    
JYOUTI

Wiersze do konwersji pliku File1.

yisha
źródło
Jeśli plik składa się z więcej niż jednego wiersza, a wynik powinien mieć więcej niż jedną kolumnę, wypróbuj ten skrypt AWK .
Wstrzymano do odwołania.
Bardzo powiązane pytanie: askubuntu.com/q/461144/295286
Sergiy Kolodyazhnyy

Odpowiedzi:

20

Za pomocą trzamień każdy powtórzony znak spacji ( ) na pojedynczy znak nowej linii ( \n).

tr -s ' '  '\n'< infile > outfile

Ale myślę, że chcesz czegoś takiego?

1 2 3 4 1 a #
abcd -> 2 b $
# $ @% 3 c @
                4 d%

Z awkmożemy zrobić:

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

Łączy ze sobą tę samą pozycję złożonego numeru pola i ENDdrukuje wynik, który byłby pierwszym wierszem w pierwszej kolumnie, drugim rzędem w drugiej kolumnie itp. Oczywiście plik wejściowy jest ograniczony do twojej pamięci.

αғsнιη
źródło
Próbowałem z tymi samymi danymi i kodem, wydrukował ostatnią kolumnę jako pierwszy rekord, jak 4 d%, a następnie drugi rekord 1 a # i tak dalej.
Abhinay
8

Możesz to po prostu zrobić poprzez grep. Domyślnie grep wypisuje dopasowanie w osobnej nowej linii.

grep -oP '\S+' infile > outfile

LUB

grep -o '[^[:space:]]\+' infile > outfile
Avinash Raj
źródło
1
+1 za kreatywne użyciegrep
Volker Siegel
8

Możesz także użyć fmtpolecenia:

~$ cat f
PAPER  TEAM  MANISH NISHA GARIMA JYOUTI
~$ fmt -1 f
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
fredtantini
źródło
7

Z GNU datamash :

$ datamash -W transpose <file
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
Cuonglm
źródło
datamashwydaje się najlepszym narzędziem do tego zadania, ale fascynujące, ile innych narzędzi można użyć!
Mark Stewart,
6

Możesz to również zrobić za pomocą sed:

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

UWAGA: Nie obsługuje sytuacji, w której słowa zawierają spacje.

slm
źródło
To wymaga GNU sed, najlepiej jak potrafię. Ten, który jest dostarczany z mac (BSD), nie widzi \nnowej linii
D. Ben Knoble
5

Używając awk, ustawiając separator pola wyjściowego ( OFS) jako separator rekordu (wiersza) ( RS):

awk '{OFS=RS;$1=$1}1' file > file2
jasonwryan
źródło
2

Za pomocą forpętli:

for val in `cat file1` ; do echo $val >> file2; done;
Mandar Shinde
źródło
0

Możesz także spróbować użyć sed

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

Pamiętaj, że używam @jako separatora dla operacji podstawienia. Spowoduje to również utworzenie pliku kopii zapasowej. Jeśli nie potrzebujesz kopii zapasowej, usuń plik .bak

$ sed -i s@' '@'\n'@g infile.txt
Vaibhav Shetye
źródło
0

Wersja Python:

python -c "import sys;lines=[l.replace(' ','\n') for l in sys.stdin.readlines()];print(''.join(lines))" < input.txt > output.txt

Używa <przekierowania do standardowego wejścia Pythona input.txti zapisuje output.txtużycie >przekierowania. Sama jednowierszowa odczytuje we wszystkich wierszach z stdinlisty ciągów, gdzie wszystkie spacje są zastępowane nowymi liniami , a my przebudowujemy cały tekst za pomocą .join()funkcji.

Alternatywnym podejściem pozwalającym uniknąć zastępowania wielu spacji w szeregu znakami nowej linii jest .split()podział wiersza na listę słów. W ten sposób możemy zapewnić, że każde słowo jest oddzielone tylko jedną nową linią

python -c "import sys;lines=['\n'.join(l.strip().split()) for l in sys.stdin.readlines()];print('\n'.join(lines))" < input.txt > output.txt
Sergiy Kolodyazhnyy
źródło
0

Używając xargs(skradziony z odpowiedzi souravc ):

xargs -n 1 < File1 > File2

Lub jeśli konieczne jest jakiekolwiek niewielkie formatowanie, użyj printfciągów formatujących, jakkolwiek mogą być potrzebne:

xargs printf '%s\n' < File1 > File2
agc
źródło
0

Moim rozwiązaniem byłoby:

#!/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
źródło
-1
awk '{for (i=1;i<=NF;i++) {print($i)}}' file > File2
Narmatha
źródło