16

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.
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 に渡します。渡す変数ごとにこれを指定する必要があります。この場合、外部変数$styleを awk variable に割り当てますs_style
  • BEGIN{FS=OFS="\t"}: デフォルトでは、出力のフィールド区切り文字はスペースではなくタブにする必要があることを awk に伝えます。
  • {$2==s_style {$2=""; sub("\t\t","\t"); print}}': 2 番目のフィールドが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 (Output Field Separator) 変数を使用すると、行間のハードコーディングを回避できます。

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