![このawkコマンドはどういう意味ですか? [閉鎖]](https://linux33.com/image/127592/%E3%81%93%E3%81%AEawk%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%AF%E3%81%A9%E3%81%86%E3%81%84%E3%81%86%E6%84%8F%E5%91%B3%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F%20%5B%E9%96%89%E9%8E%96%5D.png)
このコマンドが何を意味するのかを説明してください。
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
答え2
名前が多すぎると混乱を招く可能性がありますlist
。おそらくこれを行うと、状況がより明確になります。
awk 'BEGIN { while( getline < "filename" ) myarray[$1] }'
myarray
これにより、ファイルの各行にある最初のフィールドが配列に入力されますfilename
。
マニュアルawk
:
「Function」[..]
getline <file
$ 0をの次のレコードに設定しますfile
。