Awk заменяет столбец его хеш-значением - PullRequest
8 голосов
/ 06 ноября 2011

Как заменить столбец с его значением хеша (например, MD5) в awk или sed?

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

Ответы [ 5 ]

4 голосов
/ 13 августа 2014

Я копирую ответ вставленного жаворонка, но я добавил закрывающую строку, чтобы избежать проблемы, указанной в этом посте: gawk / awk: дата отправки в getline * иногда * не работает

awk '{
    tmp="echo " $2 " | openssl md5 | cut -f2 -d\" \""
tmp | getline cksum
close(tmp)
$2=cksum
print
}' < sample 
4 голосов
/ 06 ноября 2011

Итак, вы действительно не хотите делать это с awk.Любой из популярных высокоуровневых языков сценариев - Perl, Python, Ruby и т. Д. - сделает это более простым и надежным способом.Сказав это, что-то вроде этого будет работать.

При таком вводе, как это:

this is a test

(например, строка с четырьмя столбцами), мы можем заменить данный столбец его контрольной суммой md5например:

awk '{
    tmp="echo " $2 " | openssl md5 | cut -f2 -d\" \""
tmp | getline cksum
$2=cksum
print
}' < sample 

Это зависит от GNU awk (это, вероятно, будет по умолчанию в системе Linux) и использует openssl для генерации контрольной суммы md5.Сначала мы строим командную строку оболочки в tmp, чтобы передать выбранный столбец команде md5.Затем мы перенаправляем вывод в переменную cksum и заменяем столбец 2 контрольной суммой.Учитывая приведенный выше пример ввода, вывод этого скрипта awk будет:

this 7e1b6dbfa824d5d114e96981cededd00 a test
2 голосов
/ 06 ноября 2011

Это может работать с использованием Bash / GNU sed:

<<<"this is a test" sed -r 's/(\S+\s)(\S+)(.*)/echo "\1 $(md5sum <<<"\2") \3"/e;s/ - //'
this  7e1b6dbfa824d5d114e96981cededd00  a test

или в основном седативный раствор:

<<<"this is a test" sed -r 'h;s/^\S+\s(\S+).*/md5sum <<<"\1"/e;G;s/^(\S+).*\n(\S+)\s\S+\s(.*)/\2 \1 \3/'
this 7e1b6dbfa824d5d114e96981cededd00 a test

Заменяет is с this is a test на md5sum

Пояснение:

В первом: - определить столбцы и использовать обратные ссылки в качестве параметров в команде Bash, которая подставляется и оценивается, затем вносить косметические изменения, чтобы потерять описание файла (в данном случае стандартный ввод), сгенерированное командой md5sum.

Во втором: - аналогично первому, но перенесите входную строку в пространство удержания, затем, после оценки команды md5sum, добавьте строку G в пространство образца (результат md5sum) и используйте подстановку, подходящую для соответствия.

1 голос
/ 29 сентября 2014

Вы также можете сделать это с помощью perl:

echo "aze qsd wxc" | perl -MDigest::MD5 -ne 'print "$1 ".Digest::MD5::md5_hex($2)." $3" if /([^ ]+) ([^ ]+) ([^ ]+)/' 
aze 511e33b4b0fe4bf75aa3bbac63311e5a wxc

Если вы хотите запутать большой объем данных, это может быть быстрее, чем sed и awk, которые должны обработать процесс md5sum для каждой строки.

1 голос
/ 11 декабря 2013

Вы могли бы лучше провести время с read, чем awk, хотя я не проводил никаких тестов.

вход (scratch001.txt):

foo|bar|foobar|baz|bang|bazbang
baz|bang|bazbang|foo|bar|foobar

преобразованный с использованием read:

while IFS="|" read -r one fish twofish red fishy bluefishy; do
  twofish=`echo -n $twofish | md5sum | tr -d "  -"`
  echo "$one|$fish|$twofish|$red|$fishy|$bluefishy"
done < scratch001.txt

производит вывод:

foo|bar|3858f62230ac3c915f300c664312c63f|baz|bang|bazbang
baz|bang|19e737ea1f14d36fc0a85fbe0c3e76f9|foo|bar|foobar
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...