Вы можете использовать test
аналогично find
, например
dpkg -L somepackage | while read -r f; do [ ! -d "$f" -a -x "$f" ] && printf "$f\n"; done
для найти! -type d -executable
Вы используете FILENAME
переменную с пустым значением (вы никогда не вводите FILENAME
значение в командной строке ), это должно привести к ошибке еще до того, как awk
запускается скрипт. awk
уже имеет переменную с именем FILENAME
, которую вы можете использовать. Это имя текущего входного файла.
Используя -vNoOfRecordsPerFile
, вы говорите, что хотите присвоить значение переменной awk
в командной строке, но никогда не присваиваете ей значение. Это должно привести к ошибке, отличной от той, о которой вы говорите.Если вы хотите, чтобы он принимал значение переменной оболочки с тем же именем, используйте -v NoOfRecordsPerFile="$NoOfRecordsPerFile"
.
Итак, последняя команда awk
становится:
awk -v NoOfRecordsPerFile="$NoOfRecordsPerFile" '
((NR-1) % NoOfRecordsPerFile) == 0 { x = FILENAME "-" ++i ".txt" }
{ print > x }' "$FILENAME"
Ваша ошибка связана с условием NR%NoOfRecordsPerFile==1
, которое не выполняется перед использованием переменной x
, поэтому эта переменная не установлена.
Вместо awk
можно использоватьsplit
:
split -l 50 -d --additional-suffix='.txt' --numeric-suffixes=1 A_20 'A_20-'
Это разбивает файл A_20
на 2 файла по 50 строк с именами A_20-01.txt
и A_20-02.txt
.
Если вы хотите использовать awk
, вы можете попробовать это:
awk -v lineno=50 '((NR-1)%lineno)==0{cnt++;f=FILENAME "-" cnt ".txt"}{print >>f}' A_20