Как вставить несколько FILENAME в шаблон в awk

Возможный обходной путь, предложенный ниже @frostschutz, состоит в изменении размера байта на число, кратное смещению (, в данном случае 4096 ), т.е.

# cryptsetup -b 377520128 resize cryptdisk

Это было обнаружено, потому что в dmseg была строка, в которой говорилось, что «не выровнено по размеру логического блока h/w 4096 (диска )». Вы также можете отметить смещение в статусе cryptsetup.

Тем не менее, это было зарегистрировано как ошибка в cryptsetup здесь(опять же благодаря frostschutz ), так как проверка размера должна происходить заранее.

Надеемся, что это работает для всех, кто столкнулся с проблемой. Обратите внимание, что после того, как я выполнил первую команду с неизмененным размером байта, я все еще получал сообщения об ошибках после изменения размера байта. Только когда я закрыл и снова открыл устройство, решение frostscutz сработало.

т.е.:

# vgchange -an
# cryptsetup luksClose cryptdisk

Затем снова откройте его и перезапустите процесс с измененным размером байта;

# cryptsetup luksOpen /dev/device cryptdisk
# vgchange -ay
# cryptsetup -b 377520128 resize cryptdisk

0
20.01.2021, 10:11
1 ответ

Скрипт с подробными комментариями:

#!/bin/bash

#using the template variable is redundant, but
#I assume you want to use that lateron
template="A.tsv"
#write header from template and create file "output.txt"
#overwrites old version of "output.txt" if existing
head -n 1 ${template} > output.txt

#loop over files:
for bla in data/*.txt ; do
   #get basename without file suffix, add result to "output.txt" 
   basename -s ".txt" ${bla} >> output.txt
done

Обратите внимание, что вы должны предпочесть использовать ${variable}или "$varaible", особенно для имен файлов, иначе сценарий сломается в случае файлов с, например. пробелы в имени.


Почему подходawk-не удался?

awkзапускается на основе -строк. В вашем коде было это:

awk -v variable=$r '{print variable}' ${file}

Итак, если у вас есть файл с 10 строками, приведенная выше команда будет выполнена 10 раз и приведет к 10 строкам переменной. Для остановки awkпосле одного запуска используйте exitили укажите строку, в которой должна выполняться команда:

#execute command only on line no. 1
awk 'NR == 1 { print $1 }' file
#execute command and quit awk
awk '{ print 1 ; exit }'

Где еще оригинальный сценарий потерпел неудачу?

>>добавит вывод в файл, где >перезапишет его. В вашем сценарии у вас был цикл с этим содержимым:

( head -n 1 $template
awk [...] $bla ) > test_name.tsv

Случилось так, что для каждого совпадения в data/*txtэта команда будет выполняться, таким образом перезаписывая предыдущие версии test_name.tsvи оставляя вам только последний запуск. Обратите внимание, как вы также переписывали заголовок при каждом запуске цикла.

0
18.03.2021, 22:36

Теги

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