2013-08-15 2 views
1

мне было интересно, как разобрать parragraph, который выглядит следующим образом:Как разбирать слова в awk?

Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text 
Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text 
And many other lines with text that I do not need 

            * * * * * * * 

Autolisp - Dialect of LISP used by the Autocad CAD package, Autodesk, 
Sausalito, CA. 

CPL - 

    1. Combined Programming Language. U Cambridge and U London. A very 
complex language, syntactically based on ALGOL-60, with a pure functional 
subset. 

Modula-3* - Incoprporation of Modula-2* ideas into Modula-3. "Modula-3*: 

Так что я могу получить следующий выход из AWK предложения:

Autolisp 
CPL 
Modula-3* 

Я попытался следующие предложения, потому что файл, который я хочу фильтровать, огромен. Это список всех существующих языков программирования до сих пор, но в основном все линии следуют по той же схеме, как и выше

наказаний, которые я использовал до сих пор:

BEGIN{$0 !~ /^/&& NF == 2 && $2 == "-"} { print $1 } 

BEGIN{RS=""; ORS="\n\n"; FS=OFS="\n"} /^FLIP -/{print $1,$3} 

BEGIN{RS=""; FS=OFS="\n"} {print $1 NF-1} 

BEGIN{NF == 2 && $2 == "-" } { print $1 } 

BEGIN { RS = "" } { print $1 } 

Приговоры, которые работали для меня до сих пор:

BEGIN { RS = "\n\n"; FS = " - " } 
{ print $1 } 

awk -F " - " "/ - /{ print $1 }" file.txt 

Но он по-прежнему печатает или пропускает строки, которые мне нужны/не нужны.

Спасибо за помощь & отклик! Я сломал себе голову на несколько дней, потому что я новичок с программированием AWK

ответ

3

по умолчанию FS должно быть тонким, чтобы избежать каких-либо повторяющихся строк вы можете перенаправить вывод в sort -u

$ gawk '$2 == "-" { print $1 }' file | sort -u 
Autolisp 
CPL 
Modula-3* 

Он не может отфильтровать все, что вы хотите, но вы можете продолжать добавлять правила, пока плохие данные не фильтруются ,

В качестве альтернативы вы можете избежать использования sort с помощью ассоциативного массива:

$ gawk '$2=="-" { arr[$1] } END { for (key in arr) print key}' file 
Autolisp 
CPL 
Modula-3* 
+0

Спасибо @Dru. Он работал 2 раза, я запускал его без добавления Спасибо, –

+0

Он работал почти отлично. Мне просто нужно выяснить, как пропустить несколько строк, которые он не игнорировал, и это будет работать как шарм! много! –

+0

кажется, что вы сканируете: – Dru

1

Если это не обязательно должно быть с awk, вероятно, было бы полезно использовать grep для выбора строк в правильной форме, а затем использовать СЕПГ, чтобы обрезать конец следующим образом:

grep -e '^.* -' | sed -e 's/\(^.*\) -.*$/\1\n/; p;' 

Edit: После некоторых игр с AWK, это выглядит как часть вашего вопроса в том, что вы не всегда «[LANGUAGENAME] - [материал] ', а скорее' [languagename] - \ n [stuff] ', как в случае с CPL в образце текста, и поэтому FS = "-" не разделяется на такие вещи.

Кроме того, одним из возможных вещь, чтобы попытаться это следующим образом:

BEGIN { r = "^.* -"; } 
{ 
    if (match($0, r)) { 
     printf("%s\n", substr($0, 1, RSTART + RLENGTH - 3)); 
    } 
} 

Я на самом деле не знаю много о AWK, но это моя догадка на тиражирование, что такое Grep и SED сделать выше. Кажется, он работает над текстом примера, который вы дали, по крайней мере.

+0

Действительно @qaphla, как вы можете видеть, ни одно из приведенных выше предложений не работают для меня, любое предложение, чтобы сделать эту работу? –

+0

Я добавил скрипт awk, который должен работать, основываясь на том, что я знаю об этом и некоторых тестах. Надеюсь, это поможет. – qaphla

+0

Я пробовал свой код, но, к сожалению, для меня я не смог получить выход, который мне нужен. Он печатает следующее: Autolisp - диалект LISP, используемый в пакете Autocad CAD, Autodesk, 1. НОВАЯ ЛИНИЯ. CPL - 1. НОВАЯ ЛИНИЯ. Модула-3 * - Объединение идей Модулы-2 * в Модулу-3. «Modula-3 *. Как вы можете видеть, это своего рода« смешанный » –

Смежные вопросы