Подмножество с использованием серии чисел в цикле

Вы можете скачать пакет Debian отсюда

http://old-releases.ubuntu.com/ubuntu/pool/universe/g/gcc-3.3/gcc-3.3_3.3.6-15ubuntu6_i386.deb

и установить с помощью

sudo dpkg -i /path/to/package

2
01.08.2019, 22:01
2 ответа

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

Вы можете передать значение вawk

awk -F $'\t' -v i="$i" '$2 == i' input > "cluster.$i.txt"

Или вы можете рассматривать каждую строку отдельно и полностью избегать awk:

while read field index
do
    printf "%s\t%s\n" "$field" "$index" >> "cluster.$index.txt"
done < input

Или вы могли бы использовать awkпочти для того же самого:

awk '{ fname = "cluster." $2 ".txt"; print > fname }' input
2
27.01.2020, 21:58

$i внутри выражения awk не ссылается на переменную оболочки i. Вы можете передать переменную в командной строке с помощью -v i="$i"и обратиться к ней как к обычной i.

Также {....}определяет действие , а не шаблон ; вы, кажется, хотите выполнить действие по умолчанию (print), когда шаблон $2 == iверен. Так

for i in $(seq 1 3); do 
  awk -F "\t" -v i="$i" '$2 == i' 
input  > cluster.$i.txt; done

Однако вместо того, чтобы вызывать awk по одному разу для каждого индекса, вы можете сделать что-то вроде

awk -F "\t" '{print > "cluster" $2 ".txt"}' input

, который использует входные данные $2напрямую для построения имени выходного файла.

Обратите внимание: если вы специально не пытаетесь предотвратить разбиение поля -на символы пробела, вы, вероятно, можете удалить -F "\t"и разрешить awk разбивать разделители пробелов по умолчанию.

2
27.01.2020, 21:58

Теги

Похожие вопросы