詳細を取得し、それを水平形式に変換するにはどうすればよいですか?
各レコードはCouse
。 Couse は空でも null でもありません。
注:4つのヘッダーには、名前、都市、年齢、会社などのデータが含まれています。
2番目のレコードが表示された場合は、「Name」:「」 - >が見つからず、代わりにnullでなければならず、残りは次のようにパイプで区切られて追加されます。 null | Ors | 11 | MB
私のデモ.txtファイルには次のデータがあります。
"Name":"asxadadad ,aaf dsf"
"City":"Mum"
"Age":"23"
"Couse":"BBS"
"City":"Ors"
"Age":"11"
"Couse":"MB"
"Name":"adad sf"
"City":"Kol"
"Age":"21"
"Couse":"BB"
"Name":"pqr"
"Age":"21"
"Couse":"NN"
予想出力:
asxadadad ,aaf dsf | Mum | 23 | BBS
null | Ors | 11 | MB
adad sf | Kol | 21 | BB
pqr | null | 21 | NN
次のコードを試しましたが、私のロジックには合いません。
counter=0
var_0='Couse'
while read -r line
echo "$line"
counter=$(( counter + 1 ))
var_1=`echo "$line" | grep -oh "Couse"`
if [ $var_0 == $var_1 ]
then
head -$counter demo.txt > temp.txt
sed -i '1,$counter' demo.txt
counter = 0
else
echo "No thing to do"
fi
done < demo.txt
ベストアンサー1
すべてのUnixシステムのすべてのシェルでawkを使用してください。
$ cat tst.awk
BEGIN {
numTags = split("Name City Age Couse",nums2tags)
for (tagNr=1; tagNr<=numTags; tagNr++) {
tag = nums2tags[tagNr]
tags2nums[tag] = tagNr
wids[tagNr] = ( length(tag) > length("null") ? length(tag) : length("null") )
}
OFS=" | "
}
(NR==1) || (prevTag=="Couse") {
numRecs++
}
{
gsub(/^"|"$/,"")
tag = val = $0
sub(/".*/,"",tag)
sub(/[^"]+":"/,"",val)
tagNr = tags2nums[tag]
vals[numRecs,tagNr] = val
wid = length(val)
wids[tagNr] = ( wid > wids[tagNr] ? wid : wids[tagNr] )
prevTag = tag
}
END {
# Uncomment these 3 lines if youd like a header line printed:
# for (tagNr=1; tagNr<=numTags; tagNr++) {
# printf "%-*s%s", wids[tagNr], nums2tags[tagNr], (tagNr<numTags ? OFS : ORS)
# }
for (recNr=1; recNr<=numRecs; recNr++) {
for (tagNr=1; tagNr<=numTags; tagNr++) {
val = ( (recNr,tagNr) in vals ? vals[recNr,tagNr] : "null" )
printf "%-*s%s", wids[tagNr], val, (tagNr<numTags ? OFS : ORS)
}
}
}
$ awk -f tst.awk file
asxadadad ,aaf dsf | Mum | 23 | BBS
null | Ors | 11 | MB
adad sf | Kol | 21 | BB
pqr | null | 21 | NN
または、ハードコードされたラベルのリスト(フィールド/列名)を使用したくない場合:
$ cat tst.awk
BEGIN { OFS=" | " }
(NR==1) || (prevTag=="Couse") {
numRecs++
}
{
gsub(/^"|"$/,"")
tag = val = $0
sub(/".*/,"",tag)
sub(/[^"]+":"/,"",val)
if ( !(tag in tags2nums) ) {
tagNr = ++numTags
tags2nums[tag] = tagNr
nums2tags[tagNr] = tag
wids[tagNr] = ( length(tag) > length("null") ? length(tag) : length("null") )
}
tagNr = tags2nums[tag]
vals[numRecs,tagNr] = val
wid = length(val)
wids[tagNr] = ( wid > wids[tagNr] ? wid : wids[tagNr] )
prevTag = tag
}
END {
for (tagNr=1; tagNr<=numTags; tagNr++) {
printf "%-*s%s", wids[tagNr], nums2tags[tagNr], (tagNr<numTags ? OFS : ORS)
}
for (recNr=1; recNr<=numRecs; recNr++) {
for (tagNr=1; tagNr<=numTags; tagNr++) {
val = ( (recNr,tagNr) in vals ? vals[recNr,tagNr] : "null" )
printf "%-*s%s", wids[tagNr], val, (tagNr<numTags ? OFS : ORS)
}
}
}
$ awk -f tst.awk file
Name | City | Age | Couse
asxadadad ,aaf dsf | Mum | 23 | BBS
null | Ors | 11 | MB
adad sf | Kol | 21 | BB
pqr | null | 21 | NN
2番目のスクリプト出力の列の順序は、これらのラベルが入力に表示される順序です。したがって、すべてのラベルが表示される順序で表示されない限り、値を識別するためにヘッダー行が必要です。希望の入力彼らは出力します。