Установка awk для переменной - PullRequest
0 голосов
/ 11 октября 2011

У меня есть код, который выглядит так:

awk -F'|' '{if($1 in a)print "duplicate found:" $2 " AND "a[$1];else a[$1]=$2 }' dump.txt

Мне нужно установить переменную $ 2 и [$ 2]. Как бы я поступил так?

Я беру файл, который содержит: значение "|" имя файла, а затем я хочу установить имя файла и значение для двух разных переменных.

Ответы [ 2 ]

1 голос
/ 11 октября 2011

Что вы имеете в виду Установить эти переменные ?Являются ли эти переменные среды?В Awk переменные, которые начинаются со знака доллара и являются числовыми, зарезервированы для AWK.Это значения полей для каждой строки.Например:

test.txt =
   this is line one
   this is line two
   this is line three

Команда awk '{print $4}' test.txt выведет четвертое поле:

$ awk '{print $4}' test.txt
one
two
three

$ awk '{print $3}' test.txt
line
line
line

Как вы можете видеть: они не обязательно должны быть set .Они автоматически устанавливаются с помощью Awk.

Если вы хотите установить переменные окружения, вы можете использовать -v параметр

awk -v search="foo" '{
    if (search = $1) {
       print "Found your string in record " NR
    }'

. В приведенном выше примере search является переменной Awkэто установлено равным foo.

Поскольку Awk является языком программирования, иногда проще увидеть, что происходит, правильно отформатировав вашу программу:

awk -F'|' '{
    if($1 in a) {
      print "duplicate found:" $2 " AND " a[$1]
    }
    else {
       a[$1] = $2
    } 
}' dump.txt

Программа принимаеткаждая строка.Каждая строка состоит из двух частей, разделенных |.Похоже, что первая часть в ключе, а вторая часть - это данные.Я создал текстовый файл, который выглядит следующим образом:

This is a|test
That is a|line
who moans for|anchovies
whom moans for|anchovies
This is a|test again

Первая и последняя строки должны отображаться как дубликаты

Я взял вашу программу и добавил несколько строк отладки.Это поможет мне отследить, где оно находится в вашей программе:

awk -F\| '{
    if ($1 in a) {
        print "DEBUG: In If clause"
        print "duplicate found:" $2 " and " a[$1]
    } else {
        print "DEBUG: In else clause"
        a[$1] = $2
        print "DEBUG: a[" $1 "] = " a[$1]
    }
    print "DEBUG: $1 = " $1
    print "DEBUG: $2 = " $2 "\n"
}' test.txt

И это мой вывод

DEBUG: In else clause
DEBUG: a[This is a] = test
DEBUG: $1 = This is a
DEBUG: $2 = test

DEBUG: In else clause
DEBUG: a[That is a] = line
DEBUG: $1 = That is a
DEBUG: $2 = line

DEBUG: In else clause
DEBUG: a[who moans for] = anchovies
DEBUG: $1 = who moans for
DEBUG: $2 = anchovies

DEBUG: In else clause
DEBUG: a[whom moans for] = anchovies
DEBUG: $1 = whom moans for
DEBUG: $2 = anchovies

DEBUG: In If clause
duplicate found: test again and test
DEBUG: $1 =This is a
DEBUG: $2 = test again

Удаление строк отладки:

awk -F\| '{
if ($1 in a) {
    print "duplicate found:" $2 " and " a[$1]
} else {
    a[$1] = $2
}
}' test.txt

duplicate found: test again and test

Как говорится:

ЭТО РАБОТАЕТ НА МОЙ КОМПЬЮТЕР

(rimshot)

Серьезно, какова ваша программа?делать, и что ты видишь, что делать?Есть ли ошибки?Ваша программа работает как рекламируется.

0 голосов
/ 11 октября 2011

Установите их в переменную окружения следующим образом:

awk -F'|' '{if($1 in a)print "duplicate found:" '"$2"' " AND "a[$1];else a[$1]='"$2"' }' dump.txt

Обратите внимание, что я сделал «отключение» одинарных кавычек вокруг частей $2 и добавление двойных кавычек вокруг них в случае, если переменная окружения содержит пробелы (что awk не захочет видеть, разбивая свой аргумент на куски).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...