Самое простое решение — установить тайм-аут соединения на некоторое разумное время.
ssh -o ConnectTimeout=10 -i $key_path -p 2222 $user@$i "sudo init 0" &> /dev/null
10 секунд должно хватить.
Вы также можете использовать некоторые другие инструменты для автоматизации задач -, например Ansible.
Это легко сделать с помощью sed.
$ sed -E -e 's/^((.*)_USD.*)/\2 \1/' input.txt
P2_142 P2_142_USD16089440L_HJM27DSXX_L3
P2_144 P2_144_USD16089441L_HJM27DSXX_L3
P2_145 P2_145_USD16089442L_HJM27DSXX_L3
P2_168 P2_168_USD16089450L_HJM27DSXX_L3
P2_171 P2_171_USD16089451L_HJM27DSXX_L4
P2_172 P2_172_USD16089452L_HJM27DSXX_L4
P2_188 P2_188_USD16089456L_HJM27DSXX_L4
P2_262 P2_262_USD16089477L_HJJNWDSXX_L2
P2_270 P2_270_USD16089479L_HJJNWDSXX_L2
P2_271 P2_271_USD16089480L_HJJNWDSXX_L4
Этот скрипт sed использует две группы захвата, то есть шаблоны регулярных выражений, окруженные (
и )
. Первая — вся строка ввода, а вторая — первая часть строки перед _USD
. Он заменяет каждую входную строку второй группой захвата (\2
), пробелом, а затем первой группой захвата (\1
).
Или сawk
:
awk -F'_' -e '{print $1 "_" $2 " " $0}' input.txt
Это устанавливает разделитель полей ввода равным _
, затем (для каждой строки ввода )печатает первые два поля с символом подчеркивания между ними, пробелом, а затем всю строку ввода.
Есть несколько проблем с вашей командой:
cat samples_long.10ids.txt | \
awk -v sample="$1" '{gsub(/_USD.*/,"",sample); print $sample,$1}'
вам не нужен cat для передачи файла в awk. awk может читать имена файлов, заданные в качестве аргументов в командной строке.
Вы устанавливаете переменную awk sample
в "$1". Я предполагаю, что вы имеете в виду первое поле в awk, а не первый аргумент какой-то (un -показанной )оболочки сценария оболочки. Это не сработает. awk $1
не существует в оболочке. Он существует только тогда, когда awk читает строку входных данных.
Вы не указали awk, что использовать в качестве разделителя полей, поэтому по умолчанию используются пробелы (пробелы и табуляции ). С вашим образцом ввода,пробелов нет, поэтому $1 — это вся строка ввода (, которая называется$0
).
вы печатаете "$sample". Это говорит awk, что вы хотите напечатать номер поля, содержащийся в переменной sample
.
sample
содержит строку, поэтому оценивается как 0
в этом контексте-print $sample
эквивалентен printing $0
. так что ваш код там эффективно print $0 $1
. Фактическиprint $0 $0
-вы печатаете всю строку дважды.
если вы хотите распечатать содержимое sample
само (, а не номер поля, который sample
оценивается как ), тогда просто print sample
.
Пункты 4 и 5, вероятно, нуждаются в большем объяснении или, по крайней мере, в более простом для понимания примере.
Каждый раз, когда awk читает строку ввода, он автоматически устанавливает в переменной с именем NF
количество полей в этой строке.
Если вы хотите напечатать количество полей, просто напечатайте NF
. Если вы хотите напечатать поле, номер поля которого равен NF, вы печатаете $NF
(. Это напечатает последнее поле строки ввода ).
Вы также можете выполнять арифметические и другие операции над NF (это целое число ). например. print $(NF-1)
напечатает предпоследнее поле.
Вернемся к вашему коду :, который вы напечатали $sample
. В целочисленном контексте sample
имело значение 0
, поэтому вы напечатали $0
, то есть всю входную строку.
Учитывая все вышеперечисленное, это сработает:
awk '{sample=$1; gsub(/_USD.*/,"",sample); print sample,$1}' samples_long.10ids.txt
Но это слишком сложно для такой простой задачи. awk может разбить ввод на поля, разделенные символом подчеркивания, так что это проще сделать.
awk -F'_' -e '{print $1 "_" $2 " " $0}' samples_long.10ids.txt
Новичок awk
ошибка...
awk
принимает файл в качестве аргумента:
gawk [ POSIX or GNU style options ] [ -- ] program-text file...