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