2017-07-20 23 views
1

如果我有像格式的标签delimeted数据文件input.dat如何处理穿过管道的多个字段?

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

我可以用cut(1)或类似的东西跑每场多处理功能EX :(lookup_id, scrub_acct, scrub_name, lookup_city, scrub_age)作为数据运行通过管道?

这很容易有一个字段来做到这一点:

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

好点啊,我想你可以运行在各领域的功能,并揭开序幕子shell。有没有办法做到这一点切割? Awk有时候就是这样一个野兽。 @Cyrus – qodeninja

+0

所以'lookup_id,scrub_acct,scrub_name,lookup_city,scrub_age'是外壳的功能呢? – anubhava

回答

2

通常更容易处理的行,列数据awk但由于外壳功能受累最好是在外壳本身来处理这个问题。

假设lookup_id, scrub_acct, scrub_name, lookup_city, scrub_age是被从标准可以创建他们的数组,并调用它们,同时通过从输入文件中的每个记录循环读取输入壳函数或脚本:

# 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: 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]}” <<< “$ {进制[I]}”',更有效率? – codeforester

+0

是的没错,它避免了子shell(编辑) – anubhava

1

尝试这样使用awk:

awk -F'\t' '{system("lookup_id " $1); printf("\t"); \ 
      system("scrub_acct " $2); printf("\t"); \ 
      ... 
      }' input.dat