16

我想读取filein.txt(制表符分隔)并输出一个fileout.txt,其中仅包含与给定列的值匹配的行,并消除正在查询的列。IE,

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.
4

3 回答 3

33
awk -F"\t" '$2 == "victorian" { print $1"\t"$3 }' file.in
于 2012-11-13T16:19:37.317 回答
9

您可以使用以下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。需要为您传入的每个变量指定此项。在这种情况下,它将外部变量分配给$styleawk 变量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}'

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

于 2012-11-13T16:11:12.317 回答
2

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

awk -F"\t" -v OFS="\t" '$2 == "victorian" { print $1,$3 }' file.in
于 2014-12-11T19:37:13.233 回答