行を複数の行に分割します。新しい行には一意の値があるだけでなく、別の行に重複した値も必要です。

行を複数の行に分割します。新しい行には一意の値があるだけでなく、別の行に重複した値も必要です。

行が多いデータファイルがあり、フィールドのリストが異なる場合があります。以下はサンプルライン形式です。各フィールドは次のように区切ります@@@

runAs="X094174"@@@format="excel2007"@@@path="/Path1"@@@name="X143122"@@@name="X182881"@@@name="X094174"@@@address="[email protected]"@@@address="[email protected]"@@@AgentLoc="/loc1"

データベーステーブル(列/行形式)と同じ形式でデータをインポートしたいと思います。

runAs      format       path       AgentLoc    name      address    
X094174    excel2007    /Path1     /loc1       X143122   [email protected]   
X094174    excel2007    /Path1     /loc1       X182881   [email protected]
X094174    excel2007    /Path1     /loc1       X094174

ファイル読み取りループとawk

以下の形式でデータを生成しやすい場合は、

runAs      format       path       AgentLoc    name      address    

X094174    excel2007    /Path1     /loc1       X143122      
X094174    excel2007    /Path1     /loc1       X182881   
X094174    excel2007    /Path1     /loc1       X094174
X094174    excel2007    /Path1     /loc1                 [email protected]
X094174    excel2007    /Path1     /loc1                 [email protected]

ベストアンサー1

これアッ必要なフォームを生成します。

$ cat dat
runAs="X094174"@@@format="excel2007"@@@path="/Path1"@@@name="X143122"@@@name="X182881"@@@name="X094174"@@@address="[email protected]"@@@address="[email protected]"@@@AgentLoc="/loc1"

まず、データを行ごとに1つのアイテム形式で配置します。

$ awk -F '@@@' '{ for(i=1;i<=NF;i++){ print $i } }' dat > tmp.dat

その後、テーブルを作成し、行の終わりをクリーンアップします。

$ awk -F '=' '{
    head[$1]++;
    dat[$1,head[$1]]=$2
  } END{
    max=0;
    for(i in head){
      printf i"\t"
    }
    print "";
      for(i in dat){
        split(i, arr_i, SUBSEP);
        if(arr_i[2]>max){
          max=arr_i[2]
        }
      }
      for(j=1;j<=max;j++){
        for(i in head){
          if(head[i]==1){
            printf dat[i,1]"\t"
          }else{
            printf dat[i,j]"\t"
          }
        }
        print ""
      }
  }' tmp.dat | awk -F '\t' '{ for(i=1;i<NF;i++){ printf $i"\t" } print $NF }' > dat.xls

$ cat dat.xls
runAs   format  address AgentLoc        name    path
"X094174"       "excel2007"     "[email protected]" "/loc1" "X143122"       "/Path1"
"X094174"       "excel2007"     "[email protected]" "/loc1" "X182881"       "/Path1"
"X094174"       "excel2007"             "/loc1" "X094174"       "/Path1"

たとえば、Excelにインポートした後、TAB停止区切り文字を選択します。

ここに画像の説明を入力してください。

値が表示される順序によって、テーブルの行がどのように関連するかが決まります。

tmp.datパイプを使用すると、上記の作業を1段階で実行できるため、一時ファイルを回避できます。

おすすめ記事