Направление awk продукция к переменной

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

Так, у меня есть большой список файлов, что я должен обработать использование той же самой программы командной строки, и я пытаюсь написать маленький сценарий оболочки, чтобы автоматизировать это. Я написал что-то, что прочитает входное имя файла от текстового файла и повторит команду для каждого из тех файлов. Пока неплохо. Моя проблема, хотя с обозначением продукции. Каждый файл называют в общем формате "lane_number_bla_bla_bla", и они обрабатываются в парах. Так, будет "lane_1_bla_bla_bla_001" и "lane_1_bla_bla_bla_002", который должен объединиться в единственный выходной файл. Для этого я пытаюсь использовать awk, чтобы прочитать типовое число из .txt списка входных файлов и разобрать его в число выходного файла. Вот код, который я придумал (обратите внимание, что заявление эха перед командой там только для тестирования; это удалено когда дело доходит до управляемого фактическая программа; также это не фактическая команда, которая скорее более сложна, но принцип все еще применяется):

echo "Which input1 should I use?"
read text
input1=$text
echo "Which input2 should I use?"
read text
input2=$text
echo "How many lines?"
read text
n=$text
for i in $(seq 1 $n)
do
  awkinput1=$(awk NR==$i $input1)
  awkinput2=$(awk NR==$i $input2)
  num=$(awk 'NR==$i{print $2 }' FS="_" $input1)
  lane=$(awk 'NR==$i{print $1 }' FS="_" $input1)
  echo "command $awkinput1.in > $awkinput1.out && command $awkinput2.in > $awkinput2.out && command cat $awkinput1.out $awkinput2.in > $num-$lane-CAT.out &"
  if (( $i % 10 == 0 )); then wait; fi # Limit to 10 concurrent subshells.
done

Когда я управляю этим, обе области $awkinput заменяются правильно в линии команды соответствующим именем файла, но не областях $num и $lane, которые ничего не печатают.

Так, что я делаю неправильно? Я уверен, что это довольно просто, но я попробовал довольно много различных способов отформатировать соответствующую команду awk, и ничто, кажется, не работает. Я делаю это на отдаленном сервере Linux, используя протокол SSH, если это имеет значение.

Большое спасибо!

0
nl ja de
FS = _ , возможно, должен пойти перед сценарием
добавлено автор Kevin, источник

1 ответы

  1. Shell does not parse $i quoted by single quote ('). So quoted string should be terminated before $i.
  2. FS should be set before parsing lines.

Следующий код будет работать.

num=$(awk 'BEGIN{FS="_"} NR=='$i'{print $2 }' $input1)
lane=$(awk 'BEGIN{FS="_"} NR=='$i'{print $1 }' $input1)

Кодекс ниже будет более эффективным:

while read in1 ; do
  read in2 <&3
  num=$(awk 'BEGIN{FS="_"} {print $2 }' <<<"$in1")
  lane=$(awk 'BEGIN{FS="_"} {print $1 }' <<<"$in1")
  ...
done <$input1 3<$input2
1
добавлено
Linux Help
Linux Help
2 686 участник(ов)

Правила: https://telegra.ph/Pravila-Linux-Help-10-15

Linux Security
Linux Security
652 участник(ов)

Данная группа принципиально про безопасность и в частности про безопасность Linux. Прочие темы просим обсуждать в профильных чатах.

Linux Gaming RUS
Linux Gaming RUS
28 участник(ов)

Русскоязычный чатик, посвящённый играм на различных дистрибутивах Linux, а также wine, proton Arch Linux RU @ArchLinuxChatRU Gnome RU @gnome_ru