Возникли проблемы с awk - PullRequest
0 голосов
/ 10 октября 2011

Я пытаюсь присвоить переменную оператору awk. Я получаю ошибку. Вот код:

for i in `checksums.txt` do
md=`echo $i|awk -F'|' '{print $1}'`
file=`echo $i|awk -F'|' '{print $2}'`
done

Спасибо

Ответы [ 3 ]

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

Для этого вам не нужны внешние программы:

while IFS=\| read m f; do
  printf 'md is %s, filename is %s\n' "$m" "$f"
done < checksums.txt 

Отредактировано согласно новому требованию. Поскольку файл уже отсортирован, вы можете использовать uniq (при условии, что GNU uniq и длина хеша md 33 символа):

uniq -Dw33  checksums.txt

Если GNU uniq недоступен, вы можете использовать awk (эта версия не требует отсортированного ввода):

awk 'END {
  for (M in m)
    if (m[M] > 1) 
      print M, "==>", f[M]  
  }
{ 
  m[$1]++
  f[$1] = f[$1] ? f[$1] FS $2 : $2
  }' checksums.txt 
1 голос
/ 10 октября 2011
for i in `checksums.txt` do

Это попытается выполнить checksums.txt, что, скорее всего, не то, что вы хотите. Если вы хотите содержимое этого файла, выполните:

for i in $(<checksums.txt) ; do
  md=$(echo $i|awk -F'|' '{print $1}')
  file=$(echo $i|awk -F'|' '{print $2}')
  # ...
done

(Это не оптимально, и не будет делать то, что вы хотите, если в файле есть строки с пробелами, но, по крайней мере, это должно помочь вам начать.)

0 голосов
/ 10 октября 2011
while read line
do
  set -- `echo $line | tr '|' ' '`
  echo md is $1, file is $2
done < checksums.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...