У меня 85 файлов с такими строками:

2019-10-29-06-00;/dev/xx;128.00;106.54;/var/
2019-10-29-06-00;/dev/xx;256.00;180.79;/usr/
2019-10-29-06-00;/dev/xx;384.00;191.13;/var/
2019-10-29-06-00;/dev/xx;256.00;255.37;/var/
2019-10-29-06-00;/dev/xx;3200.00;2679.36;/var/opt/
2019-10-29-06-00;/dev/xx;256.00;255.07;/var/
2019-10-29-06-00;/dev/xx;64.00;62.67;/etc/
2019-10-29-06-00;/dev/xx;1664.00;1163.33;/opt
2019-10-29-06-00;/dev/xx;256.00;146.13;/opt/
2019-10-29-06-00;/dev/xx;2176.00;952.90;/opt/
2019-10-29-06-00;/dev/xx;22784.00;10353.91;/opt/
2019-10-29-06-00;/dev/xx;256.00;253.64;/
2019-10-29-12-00;/dev/xx;256.00;229.92;/home
2019-10-29-12-00;/dev/xx;1024.00;556.73;/opt
2019-10-29-12-00;/dev/xx;256.00;180.79;/usr/
2019-10-29-12-00;/dev/xx;384.00;190.90;/var
2019-10-29-12-00;/dev/xx;256.00;255.37;/var/
2019-10-29-12-00;/dev/xx;128.00;127.63;/
2019-10-29-12-00;/dev/xx;256.00;76.86;/opt/
2019-10-29-12-00;/dev/xx;2176.00;1682.93;/opt/
2019-10-29-12-00;/dev/xx;256.00;145.66;/opt/
2019-10-29-12-00;/dev/xx;2176.00;952.90;/opt/
2019-10-29-12-00;/dev/xx;22784.00;10421.72;/opt/
2019-10-29-12-00;/dev/xx;256.00;253.64;/
2019-10-29-18-00;/dev/xx;1024.00;138.8;/
2019-10-29-18-00;/dev/xx;5248.00;4230.34;/usr
2019-10-29-18-00;/dev/xx;2560.00;499.37;/var
2019-10-29-18-00;/dev/xx;3584.00;67.79;/tmp
2019-10-29-18-00;/dev/xx;256.00;25.9;/home
2019-10-29-18-00;/dev/xx;1024.00;467.27;/opt
2019-10-29-18-00;/dev/xx;384.00;0.38;/usr/
2019-10-29-18-00;/dev/xx;256.00;21.36;/
2019-10-29-18-00;/dev/xx;512.00;216.84;/opt/

Требуется вывод:

2019-10-29-06-00;/dev/xx;128.00;21.46;/var/
2019-10-29-06-00;/dev/xx;256.00;75.21;/usr/
2019-10-29-06-00;/dev/xx;384.00;192.87;/var/
2019-10-29-06-00;/dev/xx;256.00;0.63;/var/
2019-10-29-06-00;/dev/xx;3200.00;520.64;/var/opt/
2019-10-29-06-00;/dev/xx;256.00;0.93;/var/
2019-10-29-06-00;/dev/xx;64.00;1.33;/etc/
2019-10-29-06-00;/dev/xx;1664.00;500.67;/opt
2019-10-29-06-00;/dev/xx;256.00;109.87;/opt/
2019-10-29-06-00;/dev/xx;2176.00;1223.1;/opt/
2019-10-29-06-00;/dev/xx;22784.00;12430.1;/opt/
2019-10-29-06-00;/dev/xx;256.00;2.36;/
2019-10-29-12-00;/dev/xx;256.00;26.08;/home
2019-10-29-12-00;/dev/xx;1024.00;467.27;/opt
2019-10-29-12-00;/dev/xx;256.00;75.21;/usr/
2019-10-29-12-00;/dev/xx;384.00;193.1;/var
2019-10-29-12-00;/dev/xx;256.00;0.63;/var/
2019-10-29-12-00;/dev/xx;128.00;0.37;/
2019-10-29-12-00;/dev/xx;256.00;179.14;/opt/
2019-10-29-12-00;/dev/xx;2176.00;493.07;/opt/
2019-10-29-12-00;/dev/xx;256.00;110.34;/opt/
2019-10-29-12-00;/dev/xx;2176.00;1223.1;/opt/
2019-10-29-12-00;/dev/xx;22784.00;12362.3;/opt/
2019-10-29-12-00;/dev/xx;256.00;2.36;/
2019-10-29-18-00;/dev/xx;1024.00;138.8;/
2019-10-29-18-00;/dev/xx;5248.00;4230.34;/usr
2019-10-29-18-00;/dev/xx;2560.00;499.37;/var
2019-10-29-18-00;/dev/xx;3584.00;67.79;/tmp
2019-10-29-18-00;/dev/xx;256.00;25.9;/home
2019-10-29-18-00;/dev/xx;1024.00;467.27;/opt
2019-10-29-18-00;/dev/xx;384.00;0.38;/usr/
2019-10-29-18-00;/dev/xx;256.00;21.36;/
2019-10-29-18-00;/dev/xx;512.00;216.84;/opt/

Я пытаюсь это сделать (я набираю «2019-10», потому что в имени файла есть дата, и меня интересуют только файлы с «2019-10» в имени файла):

for i in $(ls *.txt | grep "2019-10")
do 
awk -F';' -vOFS=';' '/2019-10-29-12-00/{$4=$3-$4;} 1' $i > BACK-$i
done

Но не работает ... И я не знаю почему! Не могли бы вы показать мне, как это сделать?

3
HK2432 26 Ноя 2019 в 17:48
1
«Но это не работает» - не лучшая постановка проблемы. Многие люди не имеют доступа к AIX, поэтому они никогда не узнают, как это не работает. AIX похожа на BSD и Solaris. У них есть несколько анемичных инструментов Posixy. Не используйте расширения GNU на этих коробках. Или скопируйте файлы в Linux, чтобы использовать расширения GNU. Вероятно, все это можно сделать с помощью awk. Нет необходимости в sed.
 – 
jww
26 Ноя 2019 в 17:52
3
Нельзя заменить for i in $(ls *.txt | grep "2019-10") на for i in *2019-10*.txt? Для этого не нужно запускать внешнюю программу (в данном случае две). Также нет необходимости использовать sed. Вы можете сделать все это, используя всего лишь awk.
 – 
accdias
26 Ноя 2019 в 17:57
Строка awk выглядит так, как будто должна работать. Как это не работает? Работает на repl bash Возможно, вы не знаете, ls *.txt | grep "2019-10" - что вы думаете ls *.txt | grep "2019-10" делает?
 – 
KamilCuk
26 Ноя 2019 в 18:02
2
Уточняйте, что именно не работает. Я скопировал вашу строку awk и запустил ее в соответствии с указанным вами вводом. Я получил результат с вычтенными столбцами, правильно. Что не работает? Файлы не создаются? Ваш компьютер загорелся, и пожарная команда начала выходить из окна? Что именно происходит?
 – 
KamilCuk
26 Ноя 2019 в 18:08
1
Пожалуйста, отредактируйте свой вопрос, чтобы четко и просто изложить свои требования. У вас больше шансов получить помощь, если нам не нужно будет пытаться выяснить, что вы пытаетесь сделать из больших выборок ввода / вывода (почему вы не можете показать нам с 5 или 6 строками pf input / вывод вместо 33), сценарий, который не делает то, что вы должны делать, и множество подсказок, разбросанных по нескольким комментариям.
 – 
Ed Morton
26 Ноя 2019 в 21:45

2 ответа

Этот скрипт может выполнять свою работу:

awk -F';' -vOFS=';' '/2019-10-29-12-00/{$4=$3-$4; print} '

Я не знаю, почему этот 1 в конце не хочет работать в вашем случае

0
Romeo Ninov 26 Ноя 2019 в 21:51

Попробуй это:

for i in *2019-10*.txt; do
    awk 'BEGIN{FS=OFS=";"}/2019-10-29-(06|12)-00/{$4=$3-$4}1' "${i}" >"BACK-${i}"
done

Приведенный выше код будет соответствовать строкам с 2019-10-29-, за которыми следует 06-00 ИЛИ 12-00, как в примере вывода.

Если вам нужно сопоставить все строки в диапазоне от 06-00 до 12-000, используйте сценарий ниже:

 for i in *2019-10*.txt; do
    awk 'BEGIN{FS=OFS=";"}/2019-10-29-(0[6-9]|1[0-2])-00/{$4=$3-$4}1' "${i}" >"BACK-${i}"
done

Надеюсь, теперь он делает то, что вы хотите.

0
accdias 27 Ноя 2019 в 00:16
Здравствуйте, спасибо за помощь! Ваш цикл применяет изменение только к строкам, включая шаблон «2019-10-29-12-00». И для этого он отлично работает. Но я хотел бы применить этот цикл к первой строке файла по адресу, к последнему файлу с 2019-10-29-12-00 в качестве шаблона (так что с 2019-10-29-06-00; / dev / xx ; 128.00; 106.54; / var / до 2019-10-29-12-00; / dev / xx; 256.00; 253.64; /).
 – 
HK2432
26 Ноя 2019 в 18:18
Просто чтобы уточнить: всегда ли вы хотите, чтобы первая строка и все строки соответствия шаблону были изменены? Если это то, чего вы хотите, изменение тривиально.
 – 
accdias
26 Ноя 2019 в 18:21
Я отредактировал свой пост с нужным выводом :)
 – 
HK2432
26 Ноя 2019 в 18:22
Теперь я вижу, что вы хотите, и сценарий выше делает это. Если я правильно понял, вы хотите, чтобы все записи о 2019-10-29 06:00 и 12:00 были включены, верно? Если вам нужен временной диапазон, дайте мне знать, и я скорректирую регулярное выражение.
 – 
accdias
27 Ноя 2019 в 00:09