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

Dna*_*iel 16 unix linux 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.
Run Code Online (Sandbox Code Playgroud)

让我们说我只想选择房屋victorian风格的行,那么我的fileout.txt应该是这样的:

fileout.txt
#name\taddress
roger\t223 dolan st.
kingston\t224 house st.
Run Code Online (Sandbox Code Playgroud)

Kev*_*vin 32

awk -F"\t" '$2 == "victorian" { print $1"\t"$3 }' file.in
Run Code Online (Sandbox Code Playgroud)

  • +1.您也可以编写`print $ 1 FS $ 3`,而不是在print语句中对选项卡进行硬编码.只有偏好的事项. (2认同)

sam*_*hen 8

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

#!/bin/bash

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

说明:

  • 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}'
Run Code Online (Sandbox Code Playgroud)

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

  • +1.仅仅作为一种风格问题,我在BEGIN块中使用OFS定义FS并删除if语句:`awk -vs = $ style'BEGIN {FS = OFS ="\ t"} $ 2 == s {print $ 1 ,$ 3}'` (3认同)