Сценарии bash и попытка понять команду echo

Вот лайфхак, использующий awk, чтобы обеспечить одинаковое количество полей во всех строках.

Я предполагаю, что в первом CSV-файле максимальное количество строк :не будет работать, если это не так.

$ cat 1.csv
a,b,c
d,e,f
g,h,i

$ cat 2.csv
foo,bar
baz,qux

$ paste -d, {1,2}.csv
a,b,c,foo,bar
d,e,f,baz,qux
g,h,i,

$ paste -d, {1,2}.csv | awk -F, -vOFS=, 'NR == 1 {n = NF} NF < n {NF = n} 1'
a,b,c,foo,bar
d,e,f,baz,qux
g,h,i,,

Это может потребовать GNU awk для установки NF var.

3
20.02.2020, 16:19
2 ответа

Эхо не делает ничего умного. Это просто повторение двух символов:

  • \b— BackSpace. Это заставляет его вернуться на одну колонку на экране.

  • Видимый символ, который является одним из 4 символов в переменной sp. Это также заставляет его двигаться на один пробел вперед на экране. Таким образом, персонажи постоянно накладываются друг на друга. Итак, вы видите/-\|по порядку.

Вещь внутри ${.... }представляет собой расширение оболочки, которое зацикливается вокруг 4 символов с использованием индекса i.

  • Он выбирает символ, используя расширение подстроки ${sp:i:1}, которое выбирает один символ в позиции iиз содержимого $sp.

  • Часть i++увеличивает iкаждый раз, когда она используется, чтобы перейти на один символ в sp.

  • %— это модульная операция, необходимая для «возврата к началу», когда iпересекает конец sp.

  • ${#sp}— это расширение оболочки, которое возвращает длину sp.

Для этого трюка требуется задержка (вроде сна 0,25 )внутри цикла, чтобы замедлить вращение.

Он должен обнаружить, что то, чего вы ждете, завершено. Если бы эта оболочка запустила асинхронный процесс, она могла бы запустить «задания» и посмотреть, нет ли теперь дочерних процессов. Если он ожидает создания файла, он может проверить это.

2
28.04.2021, 23:23

Здесь действуют две переменные. Вы можете лучше видеть, что происходит с этим:

sp="abcd" i=0                                         # Initialisation
printf "%d %s %d\n" "$i" "${sp:i++%${#sp}:1}" "$i"    # Repeat this line a few times

Вы видите, что $iувеличивается на единицу($i++)при каждом использовании выражения. Это берется по модулю длины $spв качестве начального индекса в строке $sp. Таким образом, когда $iравно 6, тогда 6 % 4равно 2, поэтому печатается третий символ $sp(смещения строки начинаются с нуля)

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

sp="abcd" i=0
len_sp=${#sp}              # length of $sp

i=$(( i + 1 ))             # increment $i
mod_i=$(( i % len_sp ))    # wrap around length of $sp
sp_sub=${sp:mod_i:1}       # get substring of one character
printf "%s" "$sp_sub"      # print it

Другими интересными частями являются echo -n ' ', которая печатает пробел без завершающей новой строки, и printf "\b", которая печатает backspace.

5
28.04.2021, 23:23

Теги

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