使用Sed或Awk-Name到Title的数据转换

使用Sed或Awk-Name到Title的数据转换,awk,sed,Awk,Sed,我有以下格式的数据: APP_OWNER : hari APP_AREA : Work:Business Area:AUS APP_ID : 124080 APP_OWNER : ari APP_AREA : Work:AUS APP_ID :

我有以下格式的数据:

APP_OWNER                     : hari
APP_AREA                      : Work:Business Area:AUS
APP_ID                        : 124080
APP_OWNER                     : ari
APP_AREA                      : Work:AUS
APP_ID                        : 124345
我想把数据转换成下面的格式

APP_OWNER,APP_AREA,APP_ID
hari,Work:Business Area:AUS,124080
ari,Work:AUS,124345
我可以转换一行,但是如何同时转换三行呢

我的一行尝试

sed '0,/: /s//\n/' test.txt
原始问题:


关于

请您尝试以下内容,并用显示的样本进行书写和测试

awk -F'[[:blank:]]+:[[:blank:]]+' -v OFS="," '
/^APP_OWNER/{
  if(heading){
    count=1
    print heading
  }
  if(val){
    print val
  }
  val=""
}
count=="" && !($1 in head){
  head[$1]
  heading=(heading?heading OFS:"")$1
}
{
  val=(val?val OFS:"")$2
}
END{
  if(val){
    print val
  }
}
'  Input_file

以下是一个不硬编码任何值的
awk
解决方案:

awk-F'[:blank:][]+:[:blank:][]+''NR==1{fh=$1}!($1在hdr中){tr=(tr=“”?“”:tr=“”,“”$1;hdr[$1]}$1==fh&&NR>1{print(body?”:tr-ORS)td;body=1;td=“”}{td=(td=“”?“”:td“,”)$2}END{print td}文件
应用程序所有者、应用程序区域、应用程序ID
hari,工作:业务范围:澳大利亚,124080
阿里,工作地点:澳大利亚,124345
以下是更具可读性的版本:

awk-F'[[:blank:]+:[:blank:]+''
NR==1{
fh=1美元
}
!(hdr中为1美元){#只收集一次标题
tr=(tr=“”?“”:tr“,”)$1
hdr[$1]
}
$1==fh&&NR>1{#打印页眉和正文
打印(正文?“:tr ORS)td#如果正文=1,则仅打印正文
主体=1
td=“”
}
{
td=(td=“”?“”:td“,”)$2
}
结束{
打印td
}"档案"
$cat tst.awk
开始{OFS=“,”}
{
tag=val=$0
子(/[:空格:]*:.*/,“”,标记)
子(/[^::+:[[:空格:]*/,“”,val)
tag2val[tag]=val
}
!看见[tag]++{
标记[++numTags]=标记
}
(第%3条)=0{
如果(!doneHdr++){

对于(tagNr=1;tagNr如果有两个以上的条目,则标题为repeated@user2854333,您显示的示例未显示此内容,因为我提到的答案将仅根据SO上显示的示例给出。@user2854333,您是否可以检查我编辑的一个标题,该标题的打印时间不应超过1次左右,请让我知道它的运行情况。是的。它工作正常非常感谢。
$ cat tst.awk
BEGIN { OFS="," }
{
    tag = val = $0
    sub(/[[:space:]]*:.*/,"",tag)
    sub(/[^:]+:[[:space:]]*/,"",val)
    tag2val[tag] = val
}
!seen[tag]++ {
    tags[++numTags] = tag
}
(NR%3) == 0 {
    if ( !doneHdr++ ) {
        for (tagNr=1; tagNr<=numTags; tagNr++) {
            tag = tags[tagNr]
            printf "%s%s", tag, (tagNr<numTags ? OFS : ORS)
        }
    }

    for (tagNr=1; tagNr<=numTags; tagNr++) {
        tag = tags[tagNr]
        val = tag2val[tag]
        printf "%s%s", val, (tagNr<numTags ? OFS : ORS)
    }

    delete tag2val
}

$ awk -f tst.awk file
APP_OWNER,APP_AREA,APP_ID
hari,Work:Business Area:AUS,124080
ari,Work:AUS,124345