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.
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.
Odpowiedzi:
Za pomocą tr
zamień każdy powtórzony znak spacji ( ) na pojedynczy znak nowej linii (
\n
).
tr -s ' ' '\n'< infile > outfile
1 2 3 4 1 a # abcd -> 2 b $ # $ @% 3 c @ 4 d%
Z awk
moż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 END
drukuje 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.
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
grep
Możesz także użyć fmt
polecenia:
~$ cat f
PAPER TEAM MANISH NISHA GARIMA JYOUTI
~$ fmt -1 f
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
Z GNU datamash :
$ datamash -W transpose <file
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
datamash
wydaje się najlepszym narzędziem do tego zadania, ale fascynujące, ile innych narzędzi można użyć!
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.
\n
nowej linii
Używając awk
, ustawiając separator pola wyjściowego ( OFS
) jako separator rekordu (wiersza) ( RS
):
awk '{OFS=RS;$1=$1}1' file > file2
Za pomocą for
pętli:
for val in `cat file1` ; do echo $val >> file2; done;
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
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.txt
i zapisuje output.txt
użycie >
przekierowania. Sama jednowierszowa odczytuje we wszystkich wierszach z stdin
listy 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
Używając xargs
(skradziony z odpowiedzi souravc ):
xargs -n 1 < File1 > File2
Lub jeśli konieczne jest jakiekolwiek niewielkie formatowanie, użyj printf
ciągów formatujących, jakkolwiek mogą być potrzebne:
xargs printf '%s\n' < File1 > File2
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