Добавить разделитель вкладок в Grep - PullRequest
3 голосов
/ 01 февраля 2011

Я новичок в grep и awk, и я хотел бы создать значения, разделенные табуляцией, в выходных данных файла "interval.txt" (этот скрипт просматривает большой корпус, а затем выводит каждое отдельное слово и сколько раз оно используетсяв корпусе - я изменил его для кхмерского языка).Я оглянулся ( grep tab в UNIX ), но я не могу найти пример, который имеет смысл для этого сценария bash (я слишком большой новичок).

Я использую этот сценарий bash в cygwin:

#!/bin/bash
# Create a tally of all the words in the corpus.
#
echo Creating tally of word frequencies...
#
sed -e 's/[a-zA-Z]//g' -e 's/​/ /g' -e 's/\t/ /g' \
    -e 's/[«|»|:|;|.|,|(|)|-|?|។|”|“]//g' -e 's/[0-9]//g' \
    -e 's/ /\n/g' -e 's/០//g' -e 's/១//g' -e 's/២//g' \
    -e 's/៣//g' -e 's/៤//g' -e 's/៥//g' -e 's/៦//g' \
    -e 's/៧//g' -e 's/៨//g' -e 's/៩//g' dictionary.txt | \
  tr [:upper:] [:lower:] | \
  sort | \
  uniq -c | \
  sort -rn > frequency.txt
grep -Fwf dictionary.txt frequency.txt | awk '{print $2 "," $1}'

Awk печатает через запятую, но это только на экране.Как разместить вкладку (запятую тоже подойдет) между частотой и термином?

Вот небольшая часть файла dictionary.txt (кхмерский язык не использует пробелы, но в этом корпусеявляется неразрывным пробелом между каждым словом, которое преобразуется в пробел с использованием sed и регулярных выражений):

ព្រះ វិញ្ញាណ នឹង ប្រពន្ធ ប្រពន្ធ ថ្មី ពោល ថា អញ្ជើញ មក ហើយអ្នក ណា ដែល ឮ ក៏ ថា មក មក ដែរ ដែល ដែល ដែល នោះ មាន តែ ហើយ អ្នក ណា ដែល ចង់ ចង់ មាន តែ ទឹក ទឹក101 នោះ ចុះ ឥត ចេញ ថ្លៃ output 101

Ниже приведен пример выходных данных для частоты .txt в том виде, как он есть сейчас (частота и термин):

25605 នឹង 25043 ជា 22004 បាន 20515 នោះ

Я хочу, чтобы выходной частота.txt выглядел следующим образом (где TAB - фактический символ табуляции):

25605TABនឹង 25043TAB ជា 22004TAB បាន 20515TAB នោះ

Спасибо за помощь!

Ответы [ 3 ]

3 голосов
/ 01 февраля 2011

Вы должны иметь возможность заменить всю длинную команду sed следующим:

tr -d '[a-zA-Z][0-9]«»:;.,()-?។”“|០១២៣៤៥៦៧៨៩'
tr '\t' ' '

Комментарии:

  • 's/​/ /g' - первые две косые черты означают повторнуюиспользуйте предыдущее совпадение, которое было [a-z][A-Z], и замените их пробелами, но они были удалены, так что это неоперативный
  • 's/[«|»|:|;|.|,|(|)|-|?|។|”|“]//g' - символы канала не разделяют альтернативы в квадратных скобках, онилитерал (и более чем один является избыточным), эквивалент будет 's/[«»:;.,()-?។”“|]//g' (оставляя один канал, если вы действительно хотите удалить их)
  • 's/ /\n/g' - раньше вы заменяли вкладки пробелами, теперь выЗамените пробелы символами новой строки

Вы должны иметь нужные вкладки, вставив их в свой конвейер сразу после uniq:

sed 's/^ *\([0-9]\+\) /\1\t/'

Если выхотите, чтобы команда AWK выводила вкладку:

awk 'BEGIN{OFS='\t'} {print $2, $1}'
1 голос
/ 01 февраля 2011

Следующий скрипт должен привести вас туда, куда вам нужно.Канал к tee позволит вам увидеть вывод на экране и в то же время записать вывод в ./outfile

#!/bin/sh  

sed ':a;N;s/[a-zA-Z0-9។០១២៣៤៥៦៧៨៩\n«»:;.,()?”“-]//g;ta' < dictionary.txt | \
gawk '{$0=toupper($0);for(i=1;i<=NF;i++)a[$i]++}
   END{for(item in a)printf "%s\t%d ", item, a[item]}' | \
tee ./outfile
1 голос
/ 01 февраля 2011

Как насчет записи awk в файл с "<"? </p>

...