awk one liner仅根据列的值选择行

时间:2012-11-13 16:01:19

标签: linux unix awk

我想阅读 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.

3 个答案:

答案 0 :(得分:30)

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

答案 1 :(得分:8)

您可以使用以下awk脚本执行此操作:

#!/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脚本之外指定要选择的房屋样式,以便更容易维护
  • awk:调用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}'

但这假设您的输入文件将来没有其他字段由制表符分隔。

答案 2 :(得分:2)

使用OFS(输出字段分隔符)变量,可以避免行之间的硬编码:

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