行が多いデータファイルがあり、フィールドのリストが異なる場合があります。以下はサンプルライン形式です。各フィールドは次のように区切ります@@@
。
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段階で実行できるため、一時ファイルを回避できます。