Извлечь строку в файл, если второй столбец соответствует определенному значению - PullRequest
0 голосов
/ 23 апреля 2019

У меня есть файл, и я хочу напечатать всю строку в файле, если второй столбец соответствует определенному значению в файле

Содержимое моего файла:

    xxxxx-test|test|machine1
    xxxxx-test|abcc|machine2
    xxxxx-test|bcd|machine3
    xxxxx-test|efgh ijhk|machine4
    xxxxx-test|efgh ijhk2|machine4

Теперь я хочу эту строку xxxxx-test|efgh ijhk|machine4 grep здесь не работает эффективно

cat file.txt | grep "efgh"
xxxxx-test|efgh ijhk|machine4

Но когда я grep для test, он отображает все строки, поскольку в моем первом столбце есть строка test.

cat file.txt | grep "test"
xxxxx-test|test|machine1
xxxxx-test|abcc|machine2
xxxxx-test|bcd|machine3
xxxxx-test|efgh ijhk|machine4

awk тоже вроде не работает.

 cat file.txt | awk -F'|' '$2=="test" '
xxxxx-test|test|machine1

Эта строка ничего не дает.

 cat file.txt | awk -F'|' '$2=="efgh"'
 cat file.txt | awk -F'|' '$2=="ijhk"'

Когда значение строки для сопоставления равно test, вывод должен быть xxxxx-test|test|machine1.

Когда значение строки для сопоставления равно efgh, вывод должен быть xxxxx-test|efgh ijhk|machine4.

Когда значение строки для сопоставления равно ijhk, вывод должен быть xxxxx-test|efgh ijhk|machine4.

Есть предложения, какие еще инструменты я могу использовать?

Ответы [ 3 ]

2 голосов
/ 23 апреля 2019

Вам не нужны регулярные выражения для сопоставления литеральных строк.

$ awk -F'|' -v m='efgh' 'index($2,m)' file
xxxxx-test|efgh ijhk|machine4
2 голосов
/ 23 апреля 2019

Предполагая x=whatIwanttomatch, например, x=efgh, Если мы хотим придерживаться grep:

grep "^[^|]*|[^|]*$x" bla

Регулярное выражение соответствует началу строки, а затем поглощает все, что не является "|", затем один «|», затем то, что вы искали перед следующим «|».

Использование awk:

awk -v x="$x" -F'|' '$2 ~ x' bla

Если второй столбец соответствует efgh* (начинается сЭфхг), затем мы печатаем.

Не нужно cat в канал, просто отправьте файл в качестве аргумента в обоих случаях.Наконец, в чистом Bash:

while IFS=\| read -r col1 col2 col3; do 
    if [[ $col2 =~ *$x* ]]; then echo "$col1|$col2|$col3"; fi  ; 
done < bla

Опять же, мы хотим, чтобы второй столбец начинался с нашего совпадения.

Добавление

Чтобы убедиться, чтосовпадение - это «слово» во втором столбце, вы должны окружить соответствующее совпадение чем-то, помечающим «не цифра или буква» - в awk это может быть "([^0-9a-zA-Z]|^)"x"([^0-9a-zA-Z]|$)", где мы также должны учитывать начало строки ^ до и конец строки $ после.Для grep это будет [^[:alnum:]] вокруг $x.Для Bash вам понадобится if для 4 точных случаев (перед и после "|" или "").

0 голосов
/ 23 апреля 2019

пробовал на GNU AWK

awk -F\| '$2~/^(test|abcc|bcd)$|^efgh|ijhk$/ {print}' file.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...