0

多種多様な形式のテキスト ファイルを処理する必要があります。以下に例を示します (列ABはタブ区切りです)。

A   B
a   Name1=Val1, Name2=Val2, Name3=Val3
b   Name1=Val4, Name3=Val5
c   Name1=Val6, Name2=Val7, Name3=Val8

ファイルにはヘッダーがある場合とない場合、区切りスキームが混在している場合、上記のように名前と値のペアを持つ列がある場合など
があります。さまざまな方法でそのようなファイルからデータを抽出する必要がある場合がよくあります。たとえば、上記のデータから、Name2 が存在する場所に関連付けられた値が必要になる場合があります。すなわち

A   B
a   Val2
c   Val7

上記を例として使用するが、他のケースに拡張可能な、1行のコマンドとしてそのような操作を実行するためのツール/テクニックは何ですか?

4

6 に答える 6

1

grep、cut、sed、awkなどの基本的なbashシェルコマンドをすべて自由に使用できます。より複雑なことには、PerlまたはRubyを使用することもできます。

于 2008-09-17T11:49:36.967 に答える
1

sed はあまり好きではありませんが、次のような場合に機能します。

var="Name2";sed -n "1p;s/\([^ ]*\) .*$var=\([^ ,]*\).*/\1 \2/p" < filename

あなたにあげる:

 A B
 a Val2
 c Val7
于 2008-09-17T12:04:23.267 に答える
0

私が見てきたことから、私はこの種のことのためにAwkから始め、それからもっと複雑なものが必要な場合はPythonに進みます。

于 2008-09-17T11:51:42.330 に答える
0

私はsedを使用します:

   # print section of file between two regular expressions (inclusive)
   sed -n '/Iowa/,/Montana/p'             # case sensitive
于 2008-09-17T11:53:04.790 に答える
0

Perlを使用します。さまざまなフォーマットを扱うための小さなモジュール (または複数) を作成します。その後、そのライブラリを使用して perl ワンライナーを実行できます。次のようになります。

perl -e 'use Parser;' -e 'parser("in.input").get("Name2");'

構文について引用しないでください。ただし、それが一般的な考え方です。目の前のタスクを抽象化して、どのように行う必要があるかではなく、何をする必要があるかという観点から考えられるようにします。Ruby も別のオプションです。構文がより明確になる傾向がありますが、どちらの言語でも機能します。

于 2008-09-17T12:27:05.240 に答える
0

あなたは cygwin を持っているので、私は Perl を使います。これは最も簡単に習得でき (O'Reily の本: Learning Perlを参照してください)、広く適用できます。

于 2008-09-17T12:00:40.810 に答える