0

まず、この質問にもっと適切なタイトルがあれば、私はすべて耳にします!

これを行うより良い方法はありますか?

input.txt次の形式のデータ ファイルがあります。

field1=value1
field2=value2
field3=value3
.
.
.
field1=value4
field2=value5
field3=value6

など...そして最終的には次のようになります:

field1,value1 value4 ... valueM
field2,value2 value5 ... valueN
field3,value3 value6 ... valueO

私が試したこと:

  1. 一意のキーを生成します。cat input.txt |awk -F"=" '{print $2}' |sort -u > data_key

  2. 行をループするdata_key

#!/bin/bash

file=input.txt
keys=`cat data_key`

for value in $keys
do
  output=`cat $file |grep $value |awk -F"=" '{print $2}' |tr -s '[:space:]' '[ *]' `
  echo $value, $output
done
4

3 に答える 3

2

パールソリューション。フィールドをハッシュし、各フィールドは値の配列に関連付けられています。ただし、出力行の順序はランダムです。

perl -e 'while (<>) {
             chomp;
             ($f, $v) = split /=/, $_, 2;
             push @{ $h{$f} }, $v;
         }
         print "$_,@{ $h{$_} }\n" for keys %h;
    ' input.txt
于 2012-10-14T20:07:22.037 に答える
1

以下の awk ベースのソリューションが機能するはずです。これは、フィールド名をキーとする連想配列を使用します。値は検出されると連結されます。

awk -F'=' '{z[$1]=z[$1]" "$2} END{for(i in z){print(i","z[i])}}' file_name.txt
于 2012-10-14T20:09:13.737 に答える
0
awk -F"=" '{a[$1]=a[$1]","$2;}END{for(i in a)print i,a[i];}' your_file

以下でテスト:

> cat temp
field1=value1
field2=value2
field3=value3
field1=value4
field2=value5
field3=value6
> awk -F"=" '{a[$1]=a[$1]","$2;}END{for(i in a)print i,a[i];}' temp
field1 ,value1,value4
field2 ,value2,value5
field3 ,value3,value6
>
于 2012-10-15T10:26:27.740 に答える