$ awk 'NR==FNR{a[$2]=$1; next} {sub(" ?$"," "a[$5]); print}' file2 file1
471808241 29164840 1 10001 156197396 610146
471722917 21067410 1 31001 135961856 531101
471941441 20774160 1 7001 180995072 707012
471568655 29042630 1 15001 157502996 615246
471524711 20716360 1 4001 180226817 704011
471873918 29583520 1 2001 128567298 502216
471568650 29042631 1 15002 157502910 685221
NR==FNR
если номер текущей строки совпадает с номером строки в файле, это будет верно только для первого файлового аргумента file2
a[$2]= 1 доллар; next
сохранить пару ключ-значение из строк file2
, next
используется для пропуска остальной части кода sub(" ?$"," "a[$5])
используйте подстановку, чтобы заменить необязательный пробел в конце строки пробелом и значением из массива a
на основе 5-го столбца в качестве ключа print
, затем распечатайте измененные входные строки из file1
Ваша проблема в том, что [«Да»]
и [«Нет»]
эквивалентны [-n «Да»]
и [-n «Нет»]
и поэтому всегда оценивается как истина.
Правильный синтаксис:
if [ "$th" = "yes" ] || [ "$th" = "Yes" ]; then
...
if [ "$th" = "no" ] || [ "$th" = "No" ]; then
Или:
if [ "$th" = "yes" -o "$th" = "Yes" ]; then
...
if [ "$th" = "no" -o "$th" = "No" ]; then
Или, если вы используете bash
в качестве интерпретатора оболочки Борна:
if [ "${th,,}" = "yes" ]; then
...
if [ "${th,,}" = "no" ]; then
( $ {th ,,}
заменяется строчным значением переменной th
)
(1) Когда вы проверяете на ["Да" ]
, а затем на ["Нет" ]
, вам все равно нужно сравнивать с th
в обеих частях:
[ "$th" = "yes" ] || [ "$th" = "Yes" ]
и
[ "$th" = "нет" ] || [ "$th" = "нет" ]
(2) Для раздела, если [ "$th" = "да" ] || [ "$th" = "да" ]
, вам нужно расширить этот блок кода, чтобы включить все до проверки на No
и использовать elif
в этой точке, чтобы объединить это как один большой составной if-elif-fi
оператор.
Вот он с исправлениями, упомянутыми выше:
echo -n "Are you thirsty?" read th if [ "$th" = "yes" ] || [ "$th" = "Yes" ]; then echo "What would you like to drink?" read th if [ "$th" = "water" ]; then echo "Clear crisp and refreshing." elif [ "$th" = "beer" ]; then echo "Let me see some ID." elif [ "$th" = "wine" ]; then echo "One box or Two?" else echo "Coming right up." fi elif [ "$th" = "no" ] || [ "$th" = "No" ]; then echo "Come back when you are thirsty." fi
Ваши тесты не работают так, как вы думаете.
if [ "$var" = "value" ] || [ "Value" ];
Это не делает двух тестов на равенство. Он проверяет первый случай, а затем, если это не удается, проверяет, существует ли «Значение»
, что он и делает, потому что это нужно для проверки. Таким образом, он всегда проходил через , затем
, соответствующий if
. Вы, вероятно, захотите:
if [ "$var" = value" ] || [ "$var" = "Value" ]
Еще лучше было бы изучить case..esac
block:
case "$var" in
value|Value)
do_stuff
;;
other|Other)
do_something_else
;;
esac