Почему awk, если условное соответствие неверно - PullRequest
0 голосов
/ 29 декабря 2018

В моем проекте у меня есть два файла.

ИД пользователя контента:

6534
4524
4522
6635

Содержимое userpwinfo.txt:

nsgg315_RJ:x:4520:100::/home-gg/users/nsgg315_RJ:/bin/bash
nsgg316_ZJY:x:4521:100::/home-gg/users/nsgg316_ZJY:/bin/bash
nsgg317_CPA:x:4522:100::/home-gg/users/nsgg317_CPA:/bin/bash
nsgg318_ZRL:x:4523:100::/home-gg/users/nsgg318_ZRL:/bin/bash
nsgg319_YYM:x:4524:100::/home-gg/users/nsgg319_YYM:/bin/bash

Теперь яхотите напечатать имя пользователя, идентификатор которого находится в ID пользователя.Я написал оболочку bash вроде:

for i in $(cat userid)
do
  #username=`awk -F: '{if($3=="$i") print $1}' /root/userpwinfo.txt`
  #username=`awk -F: '$3=="$i" {print $1}' /root/userpwinfo.txt`
  #username=`awk -F: '{if($3~/$i/) print $1}' /root/userpwinfo.txt`
   username=`awk -F: '{if($3==$i) print $1}' /root/userpwinfo.txt`
   echo $username
done

Но, к несчастью, ничего не показывает.Правильный результат должен быть:

nsgg319_YYM
nsgg317_CPA

Я пытался в командной строке:

awk -F: '{if ($ 3 == 4524) print $ 1}' / root / userpwinfo.txt

Все в порядке

Может быть, если ($ 3 == $ i) неправильно в оболочке, Кто мне может помочь?

Ответы [ 2 ]

0 голосов
/ 30 декабря 2018

Если имя пользователя - то, что вам нужно, используя 2 файла, вы можете попробовать

$ cat userpwinfo.txt
nsgg315_RJ:x:4520:100::/home-gg/users/nsgg315_RJ:/bin/bash
nsgg316_ZJY:x:4521:100::/home-gg/users/nsgg316_ZJY:/bin/bash
nsgg317_CPA:x:4522:100::/home-gg/users/nsgg317_CPA:/bin/bash
nsgg318_ZRL:x:4523:100::/home-gg/users/nsgg318_ZRL:/bin/bash
nsgg319_YYM:x:4524:100::/home-gg/users/nsgg319_YYM:/bin/bash

$ cat userid.txt
6534
4524
4522
6635

$ awk -F":" ' { if( NR==FNR ) { a[$3]=$1; next } ;  if(a[$1]) print a[$1] }' userpwinfo.txt userid.txt
nsgg319_YYM
nsgg317_CPA
0 голосов
/ 29 декабря 2018

Ваш $i является переменной оболочки, но он находится внутри кавычки ', поэтому awk будет пытаться интерпретировать его вместо оболочки.

Попробуйте это:

username=`awk -F: '{if($3=='$i') print $1}' /root/userpwinfo.txt`

Обратите внимание, что $i находится между ' метками, что означает, что он находится за пределами блока, который будет интерпретирован awk, что означает, что он должен интерпретироваться оболочкой.

Также обратите внимание, что еслиу вас есть пустая строка во входном файле, ваша команда awk будет if($3==), что недопустимо и приведет к ошибке.

Я хотел бы также прокомментировать, что awk должен иметь фильтри исполнительный блок.Вам не нужно писать if внутри блока, если вы не хотите что-то необычное.Это значит, что ваша команда была бы более уместно записана как:

username=`awk -F: '($3=='$i'){print $1}' /root/userpwinfo.txt`

Обратите внимание, что даже это не очень хорошее решение, но вам уже есть над чем подумать только с этими изменениями.Когда вы будете более знакомы с awk или станете более профессиональным, вернитесь и проверьте комментарии.;)

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