awk: Как выбрать несколько подстрок из файла фиксированной длины?

Я протестировал этот сценарий, и он работает. Этот сценарий создает новый файл и удаляет старый файл, если он существует, в домашнем каталоге вашего пользователя.

#!/bin/bash
DATETIME=$(date +"%Y%m%d%H%M%S")
rm ~/env.*.txt
echo "$(hostname)
date:$DATETIME
$(env)" | tee ~/env.$DATETIME.txt

Сначала , изменена дата на DATETIME , потому что дата , скорее всего, уже определена.

Затем rm ~ / env. *. Txt удаляет любой файл в пользовательском каталоге $ HOME или ~ /, используя glob в качестве подстановочного знака, чтобы соответствовать только статической или фиксированной части имени файла.

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

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

Кроме того, я использовал tee вместо >> просто из привычки, потому что с тройником обычно никогда не бывает проблем.

Наконец, echo не нужно использовать здесь более одного раза. Я использовал открытые двойные кавычки в первой строке, включил следующие две строки для записи в файл и заканчивал закрытыми двойными кавычками в последней строке, а затем перенаправил на tee , чтобы записать вывод в файл.

При использовании tee содержимое, записанное в файл, будет напечатано в терминале, поэтому cat кажется избыточным.

Кроме того, вы можете добавить вывод в файл в виде новой строки в конце любого существующего файла, используя флаг -a с tee следующим образом: тройник -a

1
10.05.2017, 17:56
3 ответа

С GNU awk, если вам действительно нужна фиксированная ширина:

awk -v FIELDWIDTHS='2 17 7' -v OFS=', ' '{ print $1, $3 }' test.dat

С bash:

while read -r line; do
    printf '%s, %s\n' "${line:0:2}" "${line:19:7}"
done <test.dat

С несколько современным sed:

sed 's/^\(..\).\{17\}\(.\{7\}\).*/\1, \2/' test.dat

С perl:

perl -lpe '$_ = join ", ", unpack "A2x17A7"' test.dat

Вывод для любого из вышеперечисленных:

50, Mike
50, Roy
3
27.01.2020, 23:19

Короткийsedподход:

sed -En 's/^(.{2}).{17}(\S+).*/\1, \2/gp' test.dat

Выход:

50, Mike
50, Roy
0
27.01.2020, 23:19

Как насчет вырезать?

cut -c1-2,20-26 --output-delimiter ', ' test.dat
50, Mike
50, Roy
1
27.01.2020, 23:19

Теги

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