Подтвердить что ты не робот

Как разбить файл на слова в командной строке 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
...

Спасибо!

4b9b3361

Ответ 1

Используя tr:

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

Ответ 2

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

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

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

Ответ 3

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

grep -o '[[:alpha:]]*' file

Ответ 4

Простейшим инструментом является fmt:

fmt -1 <your-file

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

Ответ 5

cat input.txt | tr -d ",." | tr " \t" "\n" | grep -e "^$" -v

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

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

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

Ответ 6

эта строка awk тоже может работать?

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

Ответ 7

Основываясь на ваших ответах до сих пор, я ДУМАЮ, что вы, вероятно, ищете, - это рассматривать слова как последовательности символов, разделенные пробелами, запятыми, символами конца предложения (например, "." "!" или "?" на английском языке ) и другие символы, которые вы обычно не находите в комбинации с буквенно-цифровыми символами (например, "<" и ";", но не ' - # $ %). Теперь, "." это символ окончания предложения, но вы сказали, что $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]

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

Ответ 8

Самый простой вариант:

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

Остерегайтесь, чтобы он не обрабатывал ни апострофы, ни знаки препинания.

Ответ 9

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

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

Ответ 10

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

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

Ответ 11

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

Извините @jsageryd

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

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

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