cygwin でコマンドラインファイルを解析するためのツール

StackOverflow https://stackoverflow.com/questions/82268

  •  09-06-2019
  •  | 
  •  

質問

さまざまな形式のテキスト ファイルを扱う必要があります。以下に例を示します (コラム そして B はタブ区切りです):

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 行のコマンドとして実行するためのツール/テクニックにはどのようなものがありますか?

役に立ちましたか?

解決

私は sed はあまり好きではありませんが、次のような用途には役立ちます。

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

あなたにあげる:

 A B
 a Val2
 c Val7

他のヒント

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

これまで見てきたことから、この種のことには Awk から始めて、より複雑なことが必要な場合は Python に進むと思います。

私ならsedを使います:

   # print section of file between two regular expressions (inclusive)
   sed -n '/Iowa/,/Montana/p'             # case sensitive

cygwin があるので、Perl を使用します。それは学ぶのが最も簡単です (オライリーの本をチェックしてください: Perlの学習) 広く適用可能です。

私なら Perl を使います。さまざまな形式を処理するための小さなモジュール (または複数) を作成します。その後、そのライブラリを使用して Perl oneliners を実行できます。次のように見えるものの例:

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top