このコマンドが何を意味するのかを説明してください。
awk 'BEGIN {while (getline < "list") list[$1]}; $1 in list'
ベストアンサー1
注文する
awk 'BEGIN {while (getline < "list") list[$1]}; $1 in list' somefilename
これは次のとおりです。
awk 'BEGIN {while (getline < "list") array[$1]} $1 in array' somefilename
(ここでは変数の名前を変更して重複list
エントリarray
を削除しました;
。)最初に名前付きファイルから読み込み、(または指定されていない場合は標準入力)から読み込み、list
存在する最初の列のみを印刷します。このファイルの行は最初の列にあります。ファイルの 。somefilename
somefilename
list
「長い形式」で書かれたawk
スクリプトは、次のように書くことができます。
#!/usr/bin/awk -f
# This block runs before processing input data.
BEGIN {
# Read "list" line by line.
while (getline <"list")
array[$1] = 1 # Make an entry in the associative array
# with the first column as key.
}
# This block processes data.
# If the first column of the data is a key in the array, print the whole line.
$1 in array { print }
簡単に言えば、これは2つのファイル間の最初の列に対する生のJOIN操作で、ファイルをソートする必要はありません(ソート順が維持されますsomefilename
)。結果は、somefilename
最初の列がの最初の列の1つと一致する行になりますlist
。
順序を(ほぼ)保存しない別の方法は次のとおりです。
join <( sort list ) <( sort somefilename )
結果は異なるようにソートされ、 のすべての列はlist
出力の一部になります。どの列が必要かを知っている場合は、-o
forフラグを使用してこの問題を解決できますjoin
。
$1
スクリプトの2つの位置を$0
(最初の列ではなくフル行)に変更すると、awk
スクリプトは次のようになります。
grep -Fx -f list somefilename
ここで、ファイルはパターンリスト()list
として使用され、固定文字列()、フル行()、。grep
-f list
-F
-x
somefilename
somefilename