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

Когда awk разбивает строку на поля с помощью разделителя, она сохраняет исходную строку в переменной $0.Таким образом, он может напечатать исходную строку (при условии, что ничего не изменит $0) после выполнения операций над отдельными полями.Может ли bash's read сделать что-то подобное, когда в нем есть не только отдельные элементы, но и вся строка?

Например, со следующими input.txt

foo,bar
baz,quz

awkповедение, которое я пытаюсь имитировать в bash: awk -F, '($1 == "baz") {print $0}' input.txt

Это выведет baz,quz, потому что $0 - это целая строка, которая была прочитана, даже если строка была также разбита на два поля ($1 и $2).

Bash:

while IFS=, read -r first second; do
   if [[ "$first" == lemur ]]; then
      # echo the entire line
   fi
done < input.txt

В этом простом случае не было бы слишком сложно воссоздать исходную строку, повторивпеременные $first и $second с запятой между ними.Но в более сложных сценариях, где IFS может содержать более одного символа и может быть много полей, становится намного сложнее точно воссоздать исходную строку, если bash не поддерживает ее во время операции чтения.

1 Ответ

0 голосов
/ 25 сентября 2018

Возможно, вам придется сделать это с 2 различными read с, как

while read -r line; do
    IFS=, read first second <<<"$line"

    if [[ $first == lemur ]]; then
        printf '%s\n' "$line"
    fi
done < input.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...