grep、sed、awk、または他のLinuxツールを使用してファイルの各行で「\t$month\t$day\n」シーケンスを検索するにはどうすればよいですか?

grep、sed、awk、または他のLinuxツールを使用してファイルの各行で「\t$month\t$day\n」シーケンスを検索するにはどうすればよいですか?

grep、sed、awk、または他のLinuxツールまたはbashスクリプトを使用して、ファイルの各行から「\ t $ month \ t $ day \ n」シーケンスを検索する方法...

\t = tab  
\n = new line  
$month = Sep   #$month is a variable with the content “Sep”  
$day = 4       #$day is a variable with the content “4”? 

grepを使用すると、それぞれ\ t、\ n、$ month、および$ dayを見つけることができますが、誤った肯定を減らすために、ツールがすべての行で「\ t $ month \ t」$ day \ n」の組み合わせを検索するようにしたいと思います。一致すると、その行を標準出力、つまりコンソールに送信します。

「\t$month\t$day\n」の組み合わせに対してファイル内の各行を検索し、ツールが一致する各行をコンソールに出力するようにするにはどうすればよいですか。

例:以下は「start-with-core」ファイルの内容です。

$ cat start-with-core  
core4321        Sep     3  
core.1234       Nov     4  
core4   Sep     4  
core10  Sep     4  
core11  Nov     4  
core44  Sep     2  
core400 Sep     3  

最初のフィールド(列)の後にはタブ文字、2番目のフィールドの後にはタブ文字、3番目のフィールドの後には改行文字があります。

$ echo $month  
Sep  
                                                                             
$ echo $day    
4  

$ grep $'\n'  start-with-core  
core4321        Sep     3  
core.1234       Nov     4  
core4   Sep     4  
core10  Sep     4  
core11  Nov     4  
core44  Sep     2  
core400 Sep     3  

$ grep $'\t'  start-with-core  
core4321        Sep     3  
core.1234       Nov     4  
core4   Sep     4  
core10  Sep     4  
core11  Nov     4  
core44  Sep     2  
core400 Sep     3  

$ grep "$month"  start-with-core  
core4321        Sep     3  
core4   Sep     4  
core10  Sep     4  
core44  Sep     2  
core400 Sep     3  

$ grep "$day" start-with-core
core4321        Sep     3  
core.1234       Nov     4  
core4   Sep     4  
core10  Sep     4  
core11  Nov     4  
core44  Sep     2  
core400 Sep     3  

どんなアイデアがありますか?ありがとうございます!学生

///\\

答え1

grepパターンに一致する行を見つけたら、一致する行を探したいようです。終わり存在する\t$month\t$day

だから:

TAB=$(printf '\t') # or TAB=$'\t' with many shells
grep "$TAB$month$TAB$day\$" < your-file

ここでは$(ほとんどのシェルではエスケープなしで従うのが安全ですが、シェルが引数拡張にこれを使用するため、ここでエスケープされます")はトピックの終わりと一致します。

awk表形式のデータ処理に適しています。これを使用して、行を最後のフィールドと$day最後から2番目のフィールドと一致させることができます$month

M=$month D=$day awk -F '\t' '
  $NF == ENVIRON["M"] && $(NF-1) == ENVIRON["D"]
  ' < your-file

awk==両方のオペランドが数値のように見え、ここのように明示的に文字列として入力されていない場合は、数値比較が実行されるため一致しますSep 4が、 Sep 04// 4.0...4e0

関連情報