Замена переменными awk

Самое простое решение — установить тайм-аут соединения на некоторое разумное время.

ssh -o ConnectTimeout=10 -i $key_path -p 2222 $user@$i "sudo init 0" &> /dev/null

10 секунд должно хватить.

Вы также можете использовать некоторые другие инструменты для автоматизации задач -, например Ansible.

0
31.08.2019, 19:32
2 ответа

Это легко сделать с помощью 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}'
  1. вам не нужен cat для передачи файла в awk. awk может читать имена файлов, заданные в качестве аргументов в командной строке.

  2. Вы устанавливаете переменную awk sampleв "$1". Я предполагаю, что вы имеете в виду первое поле в awk, а не первый аргумент какой-то (un -показанной )оболочки сценария оболочки. Это не сработает. awk $1не существует в оболочке. Он существует только тогда, когда awk читает строку входных данных.

  3. Вы не указали awk, что использовать в качестве разделителя полей, поэтому по умолчанию используются пробелы (пробелы и табуляции ). С вашим образцом ввода,пробелов нет, поэтому $1 — это вся строка ввода (, которая называется$0).

  4. вы печатаете "$sample". Это говорит awk, что вы хотите напечатать номер поля, содержащийся в переменной sample.

    sampleсодержит строку, поэтому оценивается как 0в этом контексте-print $sampleэквивалентен printing $0. так что ваш код там эффективно print $0 $1. Фактическиprint $0 $0-вы печатаете всю строку дважды.

  5. если вы хотите распечатать содержимое sampleсамо (, а не номер поля, который sampleоценивается как ), тогда просто print sample.

  6. Пункты 4 и 5, вероятно, нуждаются в большем объяснении или, по крайней мере, в более простом для понимания примере.

    Каждый раз, когда awk читает строку ввода, он автоматически устанавливает в переменной с именем NFколичество полей в этой строке.

    Если вы хотите напечатать количество полей, просто напечатайте NF. Если вы хотите напечатать поле, номер поля которого равен NF, вы печатаете $NF(. Это напечатает последнее поле строки ввода ).

    Вы также можете выполнять арифметические и другие операции над NF (это целое число ). например. print $(NF-1)напечатает предпоследнее поле.

    Вернемся к вашему коду :, который вы напечатали $sample. В целочисленном контексте sampleимело значение 0, поэтому вы напечатали $0, то есть всю входную строку.

  7. Учитывая все вышеперечисленное, это сработает:

    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
    
2
28.01.2020, 02:29

Новичок awkошибка...

awkпринимает файл в качестве аргумента:

gawk [ POSIX or GNU style options ] [ -- ] program-text file...

0
28.01.2020, 02:29

Теги

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