awk / sed / grep для поиска подстроки в строке второй части / столбца, разделенной точкой с запятой, и возврата только первой части / столбца плюс подстрока

#unix #awk #sed #grep

#unix #awk #sed #grep

Вопрос:

У меня есть файл Unix, содержащий записи, разделенные точкой с запятой, как показано ниже, со 2-й частью / столбцом строки со значениями, разделенными запятыми, как показано ниже:

 789651234512;TEST-10=5,TEST-136=6,TEST-3=1,TEST-4=2,TEST-5=3,TEST-9=4,TEST-9013=100
132567123784;TEST-3=1,TEST-136=5,TEST-15=4,TEST-4=2,TEST-5=3
132564013784;TEST-3=1,TEST-15=4,TEST-4=2,TEST-5=8
132496583212;TEST-13=4,TEST-136=7,TEST-23=1,TEST-6=2,TEST-5=3,TEST-4=5,TEST-6=11
  

Я хочу найти все TEST-136=X, когда существует, где X может быть любым промежуточным числом от 1 и до 3 цифр и возвращать их, как в приведенном выше примере:

 789651234512;TEST-136=6
132567123784;TEST-136=5
132496583212;TEST-136=7
  

Я использую приведенный ниже awk, но он возвращает целую строку 2-й части / столбца:

 awk -F'[;]' '/TEST-136/{ print $1";"$2 }' file.txt
  

Однако мне нужно получить только 1-ю часть / столбец, а также часть TEST-136 = X 2-й части / столбца, как сказано.

Ответ №1:

предполагается ОДНО совпадение для каждой строки / записи.

 $ awk -F';' 'match($0, /TEST-136=[[:digit:]] /) {print $1, substr($0,RSTART,RLENGTH)}' OFS=';' kostas.txt
789651234512;TEST-136=6
132567123784;TEST-136=5
132496583212;TEST-136=7
  

Комментарии:

1. Это будет соответствовать и печатать часть CONTEST-136=123456789 , которая может быть нежелательной. Кстати, нет необходимости вставлять - выражение в скобках, оно уже является буквальным в регулярном выражении, если оно НЕ находится внутри выражения в скобках.

Ответ №2:

Это может сработать для вас (GNU sed):

 sed -En 's/^([^;]*;).*(TEST-136=[^,]*).*/12/p' file
  

Ответ №3:

Простой Perl,

 $ perl -F";" -lane ' /(TEST-136=w )/ and print "$F[0];$1" ' kostas.txt
789651234512;TEST-136=6
132567123784;TEST-136=5
132496583212;TEST-136=7
$
  

Ответ №4:

Другой awk

 $ awk -F"[;,]" ' { for(i=2;i<=NF;i  ) if($i~/TEST-136/) print $1 ";" $i } ' kostas.txt
789651234512;TEST-136=6
132567123784;TEST-136=5
132496583212;TEST-136=7
$