2017-07-20 5 views
1

私のような形式で input.datタブdelimetedデータファイルしている場合:パイプで複数のフィールドを処理するにはどうすればいいですか?

#id acct name city   age 
12 100290 Sally San Francisco 24 
15 102911 Jerry Sacramento 40 
99 102134 Amir Eureka  82 

は、私は、複数の処理機能の元:(lookup_id, scrub_acct, scrub_name, lookup_city, scrub_age)フィールドあたりのデータ実行などを実行するためにcut(1)または類似のものを使用することはできますがパイプを通して?

これは、1つのフィールドでこれを行うのは簡単です:

cat input.dat | cut -f1 | lookup_id > output.dat

が、フィールドごとにこれを行う方法があります場合、私は思ったんだけど、結果は OUTPUT.DAT にリダイレクトしています。

#id acct name city   age 
AA XXXXX0 SXXXX city-57  20s 
AC XXXXX1 JXXXX city-29  40s 
AF XXXXX4 AXXXX city-100  80s 

多分事前質問ができますか(これは簡単です)?

私はまた、paste(1)がどのようにして列を戻し合わせるかの代替方法かもしれないと考えていますが、もっと良い方法があるかもしれません。

+1

私はawkを見てみることをお勧めします。 – Cyrus

+0

ああ、私はあなたが各フィールドで機能を実行し、サブシェルを起動できると思います。カットしてこれを行う方法はありませんか? Awkは時にはそのような獣です。 @Cyrus – qodeninja

+0

'lookup_id、scrub_acct、scrub_name、lookup_city、scrub_age'はシェル関数ですか? – anubhava

答えて

2

通常awkで、行、列のデータを処理する方が簡単ですが、原因シェル関数の関与には、シェル自体にこれを処理することをお勧めします。

# example shell functions 
lookup_id() { read str; printf "lookup_id: %s\n" "$str"; } 
scrub_acct() { read str; printf "scrub_acct: %s\n" "$str"; } 
scrub_name() { read str; printf "scrub_name: %s\n" "$str"; } 
lookup_city() { read str; printf "lookup_city: %s\n" "$str"; } 
scrub_age() { read str; printf "scrub_age: %s\n" "$str"; }  

# array of functions or scripts to be invoked 
fnarr=(lookup_id scrub_acct scrub_name lookup_city scrub_age) 

# main processing 
while IFS=$'\t' read -ra ary; do 
    for ((i=0; i<${#ary[@]}; i++)); do 
     # call function for each field value 
     "${fnarr[i]}" <<< "${ary[i]}" 
    done 
    echo '=============================' 
done < <(tail -n +2 file) 

出力:

lookup_id, scrub_acct, scrub_name, lookup_city, scrub_ageと仮定すると、

は、入力ファイルから各レコードをループしながら、あなたがそれらの配列を作成し、それらを呼び出すことができる標準入力からの入力を読んでいるシェル関数やスクリプトです

lookup_id: 12 
scrub_acct: 100290 
scrub_name: Sally 
lookup_city: San Francisco 
scrub_age: 24 
============================= 
lookup_id: 15 
scrub_acct: 102911 
scrub_name: Jerry 
lookup_city: Sacramento 
scrub_age: 40 
============================= 
lookup_id: 99 
scrub_acct: 102134 
scrub_name: Amir 
lookup_city: Eureka 
scrub_age: 82 
============================= 
+1

変数置換、非常に賢い。あなたはディスパッチャーの一種としてそれを使用します、アイデアのおかげで! – qodeninja

+1

'' $ {fnarr [i]} "<<<" $ {ary [i]} "'の方が効率的ですか? – codeforester

+0

はい、そうです。サブシェル(編集済み) – anubhava

1

はawkにして、このような何かを試してみてください:

awk -F'\t' '{system("lookup_id " $1); printf("\t"); \ 
      system("scrub_acct " $2); printf("\t"); \ 
      ... 
      }' input.dat 
関連する問題