Ответ 1
awk -F"\t" '$2 == "victorian" { print $1"\t"$3 }' file.in
Я бы хотел прочитать 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.
awk -F"\t" '$2 == "victorian" { print $1"\t"$3 }' file.in
Вы можете сделать это со следующим 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}'
но это предполагает, что ваши входные файлы не будут иметь дополнительных полей, разделенных вкладками в будущем.
Используя переменную OFS (Output Field Separator), вы можете избежать жесткого кодирования между строками:
awk -F"\t" -v OFS="\t" '$2 == "victorian" { print $1,$3 }' file.in