Awk one liner выбирает только строки, основанные на значении столбца

Я бы хотел прочитать filein.txt (с разделителем табуляции) и вывести файл fileout.txt только с строками, соответствующими значению данного столбца, и устранить запрашиваемая колонка. т.е.

filein.txt
#name\thouse\taddress
roger\tvictorian\t223 dolan st.
maggie\tfrench\t12 alameda ave.
kingston\tvictorian\t224 house st.
robert\tamerican\t22 dolan st.

Скажем, я бы хотел выбрать только строки, в которых дома имеют стиль victorian, тогда мой fileout.txt должен выглядеть так:

fileout.txt
#name\taddress
roger\t223 dolan st.
kingston\t224 house st.

Ответ 1

awk -F"\t" '$2 == "victorian" { print $1"\t"$3 }' file.in

Ответ 2

Вы можете сделать это со следующим awk script:

#!/bin/bash

style="victorian"
awk -v s_style=$style 'BEGIN{FS=OFS="\t"}
    $2==s_style {$2=""; sub("\t\t","\t"); print}'

Объяснение:

  • style="victorian": присвойте стиль дома, который вы хотите выбрать вне awk script, чтобы упростить его сохранение
  • awk: invoke awk
  • -v s_style=$style: опция -v передает внешнюю переменную в awk. Необходимо указать это для каждой переменной, в которую вы проходите. В этом случае она назначает внешнюю переменную $style переменной awk s_style.
  • BEGIN{FS=OFS="\t"}: говорит awk, что разделители полей на выходе должны быть вкладками, а не пробелами по умолчанию.
  • {$2==s_style {$2=""; sub("\t\t","\t"); print}}': Если второе поле является типом дома, указанным в s_style (в данном случае, victorian), затем удалите его и распечатайте строку.

Альтернативно, вы можете сделать:

#!/bin/bash

style="victorian"
awk -v s_style=$style 'BEGIN{FS=OFS="\t"}
    $2==s_style {print $1, $3}'

но это предполагает, что ваши входные файлы не будут иметь дополнительных полей, разделенных вкладками в будущем.

Ответ 3

Используя переменную OFS (Output Field Separator), вы можете избежать жесткого кодирования между строками:

awk -F"\t" -v OFS="\t" '$2 == "victorian" { print $1,$3 }' file.in