计算各种文件中的各种元素

时间:2012-06-20 16:45:53

标签: shell unix sed awk grep

所以我有大约1000个多列的文件,但我只对其中两列的某些统计信息感兴趣。如果4美元就像一个明星的光谱类(即一个独特的价值),并且这些文件中的每个5美元是一个结果,如看到,看不见,未知等,是否有建议的方法来grep或awk out stats大约1000个文件,所以我得到类似的东西:

Type O, #verified, #not-verified, #property-j, ...
Type B, ...
Type A, ...
.
.
.
Type i,

在每个文件中,您会看到以下内容:

$1, $2, $3, Spectral Type, Result
foo, foo, foo, A, verified
foo, foo, foo, G, verified
foo, foo, foo, A, unknown
foo, foo, foo, F, verified
foo, foo, foo, G, verified
foo, foo, foo, K, verified
foo, foo, foo, K, seen

3 个答案:

答案 0 :(得分:1)

如果分隔符只是逗号,并且不需要使用转义进行CSV解析,请使用剪切实用程序:

cat $file | cut -d, -f4

答案 1 :(得分:1)

如果您的问题是:“我如何生成表格输出”$ 4,$ 5“,其中$ 4和$ 5分别是输入的第4和第5列?”一个解决方案是:

for i in list of input file; do
  awk '{print "Type "$4, $5}' $i > $i.result
done

这给出了您想要的输出,但依赖于不包含空格的所有列。如果可能有空格,您可以这样做:

 awk '{printf( "Type %s, %s", $4, $5 )}' FS=, $i > $i.result

但您可能希望修剪这将产生的额外空白。请注意,虽然在示例中我已将输入文件列表硬编码为4个文件名“list”,“of”,“input”和“file”,但我不希望您输入名称。 ,你应该以某种方式生成它们,而我只是演示了一组(很多!)迭代一组文件的方法。似乎这个问题的核心是处理awk的部分,而不是迭代。

问题的第二个读数表明每个输入文件只有一行,并且您希望在单个文件中汇总结果。在这种情况下,只需:

cat list of all files | awk '{print "Type "$4, $5}'

答案 2 :(得分:1)

perl -aF, -nle '{${$h{@F[3]}}{@F[4]}=1}END{while(($k,$v)=each%h){print"$k, @{[keys%$v]}";}}' files

修改

为什么这可以解决问题。

对于标记信息类型

perl --help

算法

{..} END{..}    # first block is evaluated on each line, END block only once at the end
@F [3]应该写成$ F [3],区别在于@F [3]是一个元素的数组,$ F [3]是元素

${h{$F[3]}}     # gets value or creates and return a new entry in the hash %h with key $F[3] third element of array @F
${..}{$F[4]}=1  # supposes that value in hash %h is type HASHREF and creates a new entry with key 

可以写出整个表达式(可能更容易),但它是第一个出现在我身上的语法

$h{$F[3]}{$F[4]}=1

END

while(($k,$v)=each%h)  # loop over entries of hash %h
"@{[..]}"   # is a trick to display array in a double quote expression
%$v         # dereferences HASHREF

问题的更密切解决方案:

perl -lnaF'/\s*,\s*/' -e '{$h{$F[3]}{$F[4]}=1;}END{while(($k,$v)=each%h){print("Type $k, ",join(", ",map("#$_",keys%$v)));}}'

注意:在这种情况下,打印后的括号是可选的,但是为了更具可读性而保留,在结束卷曲之前也是半冒号