it-swarm.com.ru

Как разбить файл на слова в командной строке unix?

Я делаю более быстрые тесты для наивной логической системы поиска информации, и я хотел бы использовать awk, grep, egrep, sed или thing similiar и pipe для разделения текстового файла на слова и сохранения их в другой файл со словом в строке , Пример моего файла cotains:

Hola mundo, hablo español y no sé si escribí bien la
pregunta, ojalá me puedan entender y ayudar
Adiós.

Выходной файл должен содержать:

Hola
mundo
hablo
español
...

Поблагодарить!

20
jaundavid

Используя tr:

tr -s '[[:punct:][:space:]]' '\n' < file
43
Guru

Самый простой инструмент - это fmt:

fmt -1 <your-file

fmt предназначен для разбиения линий на указанную ширину, и если вы укажете -1, он будет разбит сразу после Word. Смотрите man fmt для документации. Вдохновленный http://everythingsysadmin.com/2012/09/unorthodoxunix.html

6
geekQ

Использование sed:

$ sed -e 's/[[:punct:]]*//g;s/[[:space:]]\+/\n/g' < inputfile

в основном это удаляет все знаки пунктуации и заменяет все пробелы символами новой строки. Это также предполагает, что ваш вкус sed понимает \n. Некоторые этого не делают - в этом случае вы можете просто использовать буквальный перевод строки (то есть, вставив его в ваши кавычки).

3
FatalError

grep -o печатает только те части строки, которые соответствуют шаблону

grep -o '[[:alpha:]]*' file
2
umi
cat input.txt | tr -d ",." | tr " \t" "\n" | grep -e "^$" -v

tr -d ",." удаляет "," и "."

tr "\ t" "\ n" заменяет пробелы и табуляции на новые строки

grep -e "^ $" -v удаляет пустые строки (в случае двух или более пробелов)

1
kyticka

Исходя из ваших ответов, я думаю, что вы, вероятно, ищете, чтобы рассматривать слова как последовательности символов, разделенных пробелами, запятыми, символами окончания предложения (т.е. "." "!" Или "?" На английском языке) и другими символы, которые вы обычно НЕ находите в сочетании с буквенно-цифровыми символами (например, «<» и «;», но не '-#$%). Сейчас, "." является символом окончания предложения, но вы сказали, что $27.00 следует рассматривать как «слово», поэтому . нужно обрабатывать по-разному в зависимости от контекста. Я думаю, что то же самое, вероятно, верно для "-" и, возможно, некоторых других персонажей.

Поэтому вам нужно решение, которое преобразует это:

I have $27.00. We're 20% under-budget, right? This is #2 - mail me at "[email protected]".

в это:

I
have
$27.00
We're
20%
under-budget
right
This
is
#2
mail
me
at 
[email protected]

Это верно?

Попробуйте сделать это с помощью GNU awk, чтобы мы могли установить для RS более одного символа:

$ cat file
I have $27.00. We're 20% under-budget, right? This is #2 - mail me at "[email protected]".

$ gawk -v RS="[[:space:]?!]+" '{gsub(/^[^[:alnum:]$#]+|[^[:alnum:]%]+$/,"")} $0!=""' file
I
have
$27.00
We're
20%
under-budget
right
This
is
#2
mail
me
at
[email protected]

Попытайтесь придумать несколько других тестовых случаев, чтобы увидеть, всегда ли это делает то, что вы хотите.

1
Ed Morton

эта линия awk тоже может работать?

awk 'BEGIN{FS="[[:punct:] ]*";OFS="\n"}{$1=$1}1'  inputfile
1
Imagination

Использование Perl :

Perl -pe 's/(?:\p{Punct}|\s+)+/\n/g' file

Результат

Hola
mundo
hablo
español
y
no
sé
si
escribí
bien
la
pregunta
ojal�
me
puedan
entender
y
ayudar
Adiós
0
Gilles Quenot

Perl -ne 'print join ("\ n", split)' 

Прости @jsageryd 

Этот вкладыш не дает правильного ответа, так как он соединяет последнее Слово в строке с первым Словом в следующем. 

Это лучше, но генерирует пустую строку для каждой пустой строки в src. Труба через | sed '/ ^ $/d' чтобы это исправить

Perl -ne '{print join ("\ n", split (/ [[: ^ Word:]] + /)), "\ n"; }» 

0
Fred Gannett

Очень простой вариант, во-первых,

sed 's,\(\w*\),\1\n,g' file

остерегайтесь, это не обрабатывает ни апострофы, ни пунктуацию

0
jpmuc

Использование Perl:

Perl -ne 'print join("\n", split)' < file

0
jsageryd