1

次の形式の固定長ファイルがあります:

Name       Age        Party              Role 
---------- ---------- ------------------ --------------
Shubham    27         XYZ                User
Drek       28         ABC                Admin
Raj        23         USR                User

ここで、Age <25のすべてのパーティを含むファイルを出力するシェルスクリプト/コマンドを記述したいと思います。この場合、次のように出力されます。

Party
-----------------
USR

私はawkとshellに不慣れです。awkとsubstrを使用してみましたが、ファイルが巨大であるため(複数の列で200000行を超える)、コストがかかりすぎます。これを行うためのきちんとした方法はありますか?

アップデート

どのフィールドにもスペースを入れることができます。本当の考えは、ファイルが固定長のファイルであるということです。したがって、各レコードの長さは固定されています(Name:10、Age:10、Part:20、Role:10)。ただし、レコードには、スペースや空白など、データ内に何でも含めることができます。例えば:

Name       Age        Party              Role 
---------- ---------- ------------------ --------------
Shub A     27         XYZ & A            User
Drek GH    28         ABC & C            Admin
Raj        23         USR                User

等々。ここで、Nameを使用して選択を行い、スクリプトがName="ShubA"であるPartyレコードを出力するようにします。したがって、ここでの出力は次のようになります。

Party
-------------------
XYZ & A
4

5 に答える 5

1
$ awk '($2+0) < 25{print $3}' input
Party
------------------
USR

アップデート

番号(n)を含むフィールドを判別するためのさまざまなforループ、次に名前が含まれ$1..n、パーティーフィールドが含まれる$n+1..NF-1

/Shub A/ {
    # determine which field that contains a number
    for (i=1;i<NF;i++) {
        if ($i ~ /[0-9]+$/) {
            break
        }
    }
    for (j=1;j<i;j++) {
        printf "%s ", $j
    }
    for (k=(i+1);k<NF;k++) {
        printf "%s ", $k
    }

}

出力:

Shub A XYZ & A 

...または「2スペース以上」で分割してみることができます。

$ awk -F"  +" '/^Shub/{print $3}' input
XYZ & A
于 2013-03-07T15:38:31.670 に答える
1

試す:

gawk 'BEGIN{ FIELDWIDTHS = "11 11 19 14" } NR<3 || $1~/^Shub A +$/{print $3}' file
于 2013-03-07T20:23:42.200 に答える
0

このようなものが機能するはずです。最初の2行(ヘッダー)を出力し、その後、2番目のフィールドが25未満かどうかを比較します。

awk 'FNR < 3 || $2 < 25 { print $3 }' infile

それは以下をもたらします:

Party
------------------
USR

編集:これは更新前に投稿されており、機能しません。他の答えを見てください

于 2013-03-07T15:35:23.207 に答える
0

それがあなたのために働くならば、これを試してください:

 awk 'NR<3||($2+0)<25{a[++i]=$3}END{for(x in a)print a[x]}' file
于 2013-03-07T15:35:57.997 に答える
0

あなたの年齢のどれも完全な10桁を満たしていないことがわかっている場合は、おそらく次のことを行うことができます。

< input-file cut -b 11-30 | awk '$1 < 25' | cut -b 11-
于 2013-03-07T16:28:36.267 に答える