Cut работает по столбцу в bash

Я пытаюсь извлечь информацию и отправить ее в БД из текстового файла, в котором есть эти строки.

EndDate=2014-04-08;Time=00:00:49;ID=1144877;AppName=Ad (ba);MetricName=EndUser1;average_network_time=0
EndDate=2014-05-08;Time=00:00:50;ID=1144878;AppName=Ad (qa);MetricName=EndUser/Apdex;score=1.0;s=0;t=0;f=0

Я написал сценарий:

var1="EndUser"
var2="EndUser/Apdex"
var6="path to file"

for line in $var6
do

EndDate=`cut -d';' -f1 $line | cut -d'=' -f2`
echo $EndDate
Time=`cut -d';' -f2 $line | cut -d'=' -f2`
echo $Time
ID=`cut -d';' -f3 $line | cut -d'=' -f2`
echo $ID
AppName=`cut -d';' -f4 $line | cut -d'=' -f2`
echo $AppName
MetricName=`cut -d';' -f5 $line | cut -d'=' -f2`
echo $MetricName

if [ "$MetricName" == "$var1" ];then
echo "in If" 
average_network_time=`cut -d';' -f6 $line | cut -d'=' -f2`
echo "avg=$average_network_time"
echo "('$EndDate','$Time','$ID','$AppName','$MetricName','$average_network_time');"
mysql -h servername -u ID -p'pass' name -e "insert into check_copy(EndDate,Time,ID,AppName,MetricName,average_network_time) values ('$EndDate','$Time','$ID','$AppName','$MetricName','$average_network_time');"
fi

if [ "$MetricName" == "$var2" ];then
echo "in If2" 
score=`cut -d';' -f6 $line | cut -d'=' -f2`
echo $score
s=`cut -d';' -f7 $line | cut -d'=' -f2`
t=`cut -d';' -f8 $line | cut -d'=' -f2`
f=`cut -d';' -f9 $line | cut -d'=' -f2`
mysql -h servername -u ID -p'pass' name -e "insert into check_copy(EndDate,Time,ID,AppName,MetricName,score,s,t,f) values ('$EndDate','$Time','$ID','$AppName','$MetricName','$score','$s','$t','$f');"
fi

Результат, который я получаю:

2014-04-08 2014-05-08
00:00:49 00:00:50
1144877 1144878
Ad (ba) Ad (qa)
EndUser1 EndUser/Apdex

Ожидаемый выход:

2014-04-08 00:00:49 1144877 Ad (ba) EndUser1 0
2014-05-08 00:00:50 1144878 Ad (qa) EndUser/Apdex 1.0 0 0 0

Моя проблема: он не попадает в сам цикл. Может быть, потому что он делает это по столбцам, я хочу, чтобы он напечатал среднее значение времени сети, счет, s, t, f для соответствующих имён метрик.


person user3407570    schedule 14.04.2014    source источник
comment
Я удивлен, что это дает хоть что-нибудь. cut -d';' -f1 $line не сработает.   -  person devnull    schedule 14.04.2014
comment
Но он работает, и я получаю результат. Любые предложения о том, что делать, чтобы он работал, как вы говорите, не будет   -  person user3407570    schedule 14.04.2014
comment
Я не понимаю, где ты делаешь. Кроме того, вы можете использовать echo -n, чтобы избежать перевода строки. Для тестов if вы должны проверить, используете ли вы правильный оператор сравнения (могут ли строки быть ==?). Кроме того, как восстановленный пользователь cut, я могу сказать вам, что синтаксис правильный, но это в значительной степени проблема sed / awk - следуйте по пути, который указал вам Clement.   -  person jg3    schedule 15.04.2014
comment
Здесь я забыл упомянуть о готовом, так как это всего лишь часть моего полного сценария. Да, он уравновешивается, когда я делаю это отдельно и даю эхо-оператор для проверки. Моя проблема связана с вырезом, поскольку он делает это по столбцам по строкам, а не по циклам от строки к строке. Он не попадает в сам цикл if. Но если я делаю это с одной строкой, все работает отлично.   -  person user3407570    schedule 16.04.2014


Ответы (1)


Если file имеет

EndDate=2014-04-08;Time=00:00:49;ID=1144877;AppName=Ad (ba);MetricName=EndUser;average_network_time=0
EndDate=2014-05-08;Time=00:00:50;ID=1144878;AppName=Ad (qa);MetricName=EndUser/Apdex;score=1.0;s=0;t=0;f=0

Следующая команда sed

sed -n -r -e '/MetricName=EndUser;/{s/^EndDate=(.*);Time=(.*);ID=(.*);AppName=(.*);MetricName=(EndUser);average_network_time=(.*)$/\1 \2 \3 \4 \5 \6/gp}'  -e '/MetricName=EndUser\/Apdex/{s/^EndDate=(.*);Time=(.*);ID=(.*);AppName=(.*);MetricName=(EndUser\/Apdex);score=(.*);s=(.*);t=(.*);f=(.*)$/\1 \2 \3 \4 \5 \6 \7 \8 \9/gp}' file

дам

2014-04-08 00:00:49 1144877 Ad (ba) EndUser 0
2014-05-08 00:00:50 1144878 Ad (qa) EndUser/Apdex 1.0 0 0 0

Работает с GNU sed version 4.2.1. Вы можете сгенерировать запрос mysql напрямую, изменив часть replacement в s/pattern/replacement/pg

person clement    schedule 14.04.2014
comment
Спасибо. Я использую Mac OS, и, похоже, она не работает. Я все еще пытаюсь модифицировать и изучать Mac OS, сохраняя приведенное выше в качестве справки. Любые предложения будут большим подспорьем. - person user3407570; 14.04.2014
comment
Какая у вас Mac OS версия? - person clement; 14.04.2014