2016-05-26 6 views
0

私は本当に不思議です:シェルのテキスト処理プログラムを支援するツールはありますか?> 1つのカラムをカットし、テキスト処理プログラムに提供してから戻します。shellコマンドは1つのカラムだけを扱います

例えば、私が持っているファイル:

3f27,tom,17 
6d44,jack,19 
139a,jerry,7 

私はフィールド2を変更したいが、すべてのAEIOUを削除します。

この問題を回避する方法はたくさんあります。しかし、なぜ我々はそれに直面しないのですか?

ように私は、ツールをしたい:これは、よりクリーンで強力です

deal-only -d"," -f2 sed 's/[aeiou]//g' 

だから、誰かがそのようなツール、または同様の解決策を知っていますか? いいえの場合は、作成します。


私は上記に述べたように、私はsedを知られている、またはawkがよく問題の上に対処することができます。 しかし、複雑な問題が発生した場合、sedまたはawkで保存できません。

deal-only -d"," -f2 ./ip2country.rb 

ここで、カラム2をipからcountryに変更したいとします。その後

# script.awk 
BEGIN { FS="," } 
{print $1 "," gensub("[aeiou]+", "", "g", $2) "," $3} 

awk使用

+0

目標は、少なくともあなた自身でこれを解決するために行った研究努力を示すために独自のコードを追加することです。 – Cyrus

+0

awkは特定の列のみを処理するのに非常に適しています。 awkのソリューションは非常に明確になる傾向があります。 sedとawkの後、perlやpythonは次の強力なツールになります。また、異なる視点のために:Excelやlibreofficeなどのスプレッドシートは、列を使った作業で**非常に優れています**、豊富な機能を備えています。 –

+0

@Cyrus問題を更新しました。第二の要求は、私が会った本当の問題です。私はこの問題を処理するのに多くの時間を費やします。答えがほしい、ショーのためではない。 – pjincz

答えて

0

あなたはbashコプロセス機能を使用することができます(例えばhereを参照してください):

  • これは

  • 列データ*のMUSTをフィルタリングプロセスの標準出力が*ラインバッファなし/バッファリングされ(これはstdbuf -oL一部であるPOSIXされていない - 上記セクション「バッファリング」を参照-mentioned文書)

  • (私の知る限り)同じ効果は、バックグラウンドプロセスとi/o redirectionを産卵することによって達成することができる

  • 2本の名前付きパイプは、単一のEに連結

    (私の知る限り)

  • xternal「資源重い」プロセス入力/出力は、同様に動作するはず

  • 私だ、これが最善の方法ですが、それは私

幸運のための作業を行う場合は、100%確実ではありません!

1

#!/bin/bash 

coproc stdbuf -oL sed 's/[aeiou]//g' 

while IFS="," read a b c ; do 
    echo "${b}" >&${COPROC[1]} 
    read -u ${COPROC[0]} b2 
    echo "${a},${b2},${c}" 
done 

いくつかのランダムノート:

awk -f script.awk < data.txt 
+0

私はこのように知っていますが、次のような問題があると考えています。あなたはスクリプトを持っています:ip2country、行ごとにipを読み込み、行単位で国を出力します。 7391238c2 1.2.3.4 aaa xxx bbb 8987c2d3a 2.3.4.5 ddd eee rrr awkは助けになりません。sedも助けません。 :p ip2countryは多くのテーブルを読み込む必要があるため、起動するのに高価です。 – pjincz

関連する問題