2016-07-25 8 views
0

このコマンドをbashで使用して操作するのに問題があります。以下は、私が持っているものです。どのように 'while ..と作業するのですか。行う..; bashでdoneを実行しました

cat namelist | while read line; do awk '$1 == $line {print $0}' Jan.txt; done 

namelistは、各ライン上の各名前で中継されない名前リストです。私はちょうどこのファイルにnamelistに名前と一致し、このファイル内の情報の各行に操作を行うにしようとしていますが、私は$1 == $lineをしたとき

ermartin pts/10  Tue Jan 19 09:49 - 10:15 (00:26)  171.66.208.139 
sdou  pts/6  Tue Jan 19 01:52 - 22:20 (9+20:27) 131.243.186.99 
sdou  pts/2  Tue Jan 19 01:20 - 22:20 (9+20:59) 131.243.186.99 
phu  pts/2  Sat Jan 16 12:21 - 15:13 (02:52)  lbl-ipsec-7667.dhcp.lbl.gov 
phu  pts/2  Sat Jan 16 10:07 - 12:01 (01:54)  lbl-ipsec-7622.dhcp.lbl.gov 
sjames pts/5  Fri Jan 15 12:06 - 13:06 (01:00)  lakshmi.lbl.gov 
ermartin pts/2  Fri Jan 15 08:36 - 12:43 (04:07)  171.66.208.134 
ermartin pts/2  Fri Jan 15 08:31 - 08:36 (00:05)  171.66.208.134 
camitche pts/4  Thu Jan 14 15:18 - 20:47 (05:28)  171.66.208.134 
ermartin pts/2  Thu Jan 14 13:20 - 15:57 (02:36)  171.66.208.139 
ermartin pts/2  Thu Jan 14 12:35 - 13:00 (00:25)  171.66.208.139 
sjames pts/2  Thu Jan 14 06:17 - 06:27 (00:09)  phys1.als.lbl.gov 
sjames pts/2  Thu Jan 14 06:17 - 06:17 (00:00)  phys1.als.lbl.gov 
ermartin pts/0  Wed Jan 13 15:19 - 15:50 (00:31)  171.66.208.139 
ermartin pts/0  Wed Jan 13 07:55 - 08:09 (00:13)  c-24-130-14-154.hsd1.ca.comcast.net 

:そしてJan.txtは、このような情報のファイルですそれは誤りだと言います。このコマンドを正しく使用するにはどうすればよいですか?

がヶ月でもループすることが可能であり、などのように、タイトルとしてそれらを印刷:

[Jan] 
sjames ...hours 
sdou ...hours 

[Feb] 
sjames ...hours 
sdou ...hours 
+0

1行に1度だけ 'awk'を実行するのは、あなたの入力全体を1つの' awk'呼び出しで処理するのではないのですか? –

+0

btw、問題は 'while read'ループとは関係ありません。変数を 'awk'に渡すことは問題です。 'awk '$ 1 == $ line''では、' awk'はシェル変数 'line'へのコンテンツへのアクセス権を持っていません - これは' while read'ループがなくても真実です。 –

+0

これも、Janを「フィルタリング」するように思えます。'namelist'の名前のtxtファイルだけです。 'grep -F -f namelist Jan.txt'はどうですか? ?がんばろう。 – shellter

答えて

3

まず、awkはシェル変数を共有しません。ただし、-vオプションを使用してシェル変数をawk変数に転送することは可能です。参考文献にちょうどlineなしにドル記号と同様にline変数をawkは

cat namelist | while read line; do awk -v line="$line" '$1 == line {print $0}' Jan.txt; done 

注:以下の作品や、あなたのコードへの唯一の変化は-v line="$line"オプションを追加しています。

上記パイプラインのための可能な交換がある:ここでは

awk 'FNR==NR{a[$1]; next;} $1 in a' namelist Jan.txt 

は、連想配列anamelistに何であったかの名前を追跡し、Jan.txtの行を印刷するかどうかを決定するためにそれを使用しています。

あなたは、データの任意のより多くの処理をするつもりはなかったしている(しかし、私は逆が真であることを集める)、そして、Shellterはコメントで示唆するように、上記に置き換えることができれば:

grep -Ff namelist Jan.txt 

あなたがしようとし、その後、名前リスト内のユーザーが使用した時間を計算したい場合は、次の例として

$ awk -F'[ +:()]+' 'FNR==NR{a[$1]; next;} !($1 in a){next} NF==13{b[$1]+=$12+60*$11} NF==14{b[$1]+=$13+60*($12+24*$11)} END{for (n in b)print n,b[n]}' namelist Jan.txt 

を、この名前リストを考えてみます。

$ cat namelist 
sdou 
phu 

計算時間は以下のとおりです。

awk -F'[ +:()]+' ' 
    FNR==NR{ 
    a[$1] 
    next 
    } 

    !($1 in a){ 
    next 
    } 

    NF==13{ 
    b[$1]+=$12+60*$11 
    } 

    NF==14{ 
    b[$1]+=$13+60*($12+24*$11) 
    } 

    END{ 
    for (n in b) 
     print n,b[n] 
    } 
    ' namelist Jan.txt 
phu 286 

は、ユーザーが月によって利用状況を追跡するために:

$ awk -F'[ +:()]+' 'FNR==NR{a[$1]; next;} !($1 in a){next} NF==13{b[$1]+=$12+60*$11} NF==14{b[$1]+=$13+60*($12+24*$11)} END{for (n in b)print n,b[n]}' namelist Jan.txt 
phu 286 
sdou 28406 

は読みやすくするために、複数行にわたる同じコード拡散を参照する方が簡単な場合があり

$ awk -F'[ +:()]+' 'FNR==NR{a[$1]; next;} !($1 in a){next} NF==13{b[$1"["$4"]"]+=$12+60*$11} NF==14{b[$1"["$4"]"]+=$13+60*($12+24*$11)} END{for (n in b)print n,b[n]}' namelist Jan.txt 
phu[Jan] 286 
sdou[Jan] 28406 
+0

私は実際に次のようなことをしたいと思っています:ファイル内の名前のための :名前リストのthe_nameの場合:name == the_name:ファイル名と出力時刻の計算 – Edccccch

+0

計算時間を計算しました。それは、どうすれば問題のあるループのために私を混乱させるのですか? – Edccccch

+0

これは素晴らしいです! – Edccccch

関連する問題