Пропустить операцию на строке, если в одном из столбцов есть буквы - bash - PullRequest
0 голосов
/ 17 декабря 2018

Я пытаюсь пропустить операции над строками столбцов, где End_time имеет значение "Failed".

Вот мой фактический файл.

check_time.log

Done  City                               Start_time  End_time
  Yes   Chicago                            18          10
  Yes   Atlanta                            208         11
   No   Minnetonka                          57        Failed
  Yes   Hopkins                           112         80
   No   Marietta                          2018        Failed

Вот что у меня есть.

awk 'BEGIN { OFS = "\t" } NR == 1 { $5 = "Time_diff" } NR >= 2 { $5 = $3 - $4 } 1' < files |column -t

Вывод:

  Done  City                               Start_time  End_time  Time_diff
  Yes   Chicago                            18          10        8
  Yes   Atlanta                            208         11        197
   No   Minnetonka                          57        Failed     57
  Yes   Hopkins                           112         80        32
   No   Marietta                          2018        Failed    2018

Желаемый вывод должен выглядеть так:

  Done  City                               Start_time  End_time  Time_diff
  Yes   Chicago                            18          10        8
  Yes   Atlanta                            208         11        197
   No   Minnetonka                          57        Failed 
  Yes   Hopkins                            112         80        32
   No   Marietta                          2018        Failed    

Так как мнепропустить это?

Ответы [ 3 ]

0 голосов
/ 17 декабря 2018

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

awk '
FNR==1{
  print $0,"Time_Diff"
  next
}
$NF!="Failed"{
  $(NF+1)=$(NF-1)-$NF
}
1
'  Input_file | column -t

Вывод будет следующим.

Done  City        Start_time  End_time  Time_Diff
Yes   Chicago     18          10        8
Yes   Atlanta     208         11        197
No    Minnetonka  57          Failed
Yes   Hopkins     112         80        32
No    Marietta    2018        Failed

Объяснение: Теперь добавим полное объяснение вышеприведенного кода.

awk '                      ##Starting awk program from here.
FNR==1{                    ##Checking conditoin if line is very first line then do following.
  print $0,"Time_Diff"     ##Printing current line with string Time_Diff here on very first line to print headings.
  next                     ##next is awk keyword which will skip all further statements from here.
}
$NF!="Failed"{             ##Checking if last field $NF where NF is number of fields and $ means in awk field value is NOT failed then do following.
  $(NF+1)=$(NF-1)-$NF      ##Add a new column by doing $(NF+1) whose value will be difference of 2nd last column and last column as per samples.
}                          ##Closing this condition block here.
1                          ##Mentioning 1 will print edited/non-edited line for Input_file.
' Input_file   |           ##Mentioning Input_file name and passing awk program output to next command by using pipe(|).
column -t                  ##Using column -t will print the output in TAB separated format.
0 голосов
/ 17 декабря 2018

Если вы рассматриваете Perl,

> cat kwa.in 
Done  City                               Start_time  End_time
  Yes   Chicago                            18          10
  Yes   Atlanta                            208         11
   No   Minnetonka                          57        Failed
  Yes   Hopkins                           112         80
   No   Marietta                          2018        Failed
> perl -lane ' print join(" ",@F,"Time_Diff") if $.==1; if($.>1 ) { $F[4]=$F[2]-$F[3] if not $F[3]=~/Failed/; print join(" ",@F) } ' kwa.in | column -t
Done  City        Start_time  End_time  Time_Diff
Yes   Chicago     18          10        8
Yes   Atlanta     208         11        197
No    Minnetonka  57          Failed
Yes   Hopkins     112         80        32
No    Marietta    2018        Failed
> 
0 голосов
/ 17 декабря 2018

Вы просто сможете изменить:

$5 = $4 - $5

на:

if ($4 != "Failed") { $5 = $3 - $4 }

Это будет:

  • отказаться от изменения $5 спустое до вычисленного значения в строках, где время окончания равно Failed
  • правильно выполнит вычисление для всех остальных строк.

Я говорю правильно , поскольку, как представляется, вы хотите, чтобы время начала минус время окончания в этих случаях,несмотря на то, что длительность факта, как правило, является временем окончания минус время начала.Я изменил его, чтобы он соответствовал вашему желаемому результату, а не «вменяемому» ожиданию.

Ниже приведена расшифровка, чтобы вы могли увидеть ее в действии:

pax$ awk 'BEGIN{OFS="\t"}NR==1{$5="Time_diff"}NR>=2{if($4!="Failed"){$5=$3-$4}}1' <inputFile.txt |column -t
Done  City        Start_time  End_time  Time_diff
Yes   Chicago     18          10        8
Yes   Atlanta     208         11        197
No    Minnetonka  57          Failed
Yes   Hopkins     112         80        32
No    Marietta    2018        Failed

И простокроме того, вы можете захотеть подумать, что произойдет, когда вы начнете получать информацию от New York, San Antonio, Salt Lake City или, что еще хуже, Maccagno con Pino e Veddasca: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...