【问题标题】:How to transpose data after when match found in array在数组中找到匹配后如何转置数据
【发布时间】:2021-04-25 17:28:16
【问题描述】:

我希望 xml 数据中的数据为 csv 格式

此问题中提供了要测试的 xml 数据 extract data between tags <t> </t>

注意:xml文件中的数据可能不同,Header也会不同

在这个 xml 中它们是 3 个标题 -> NAME,AGE,COURSE

我已经使用下面的命令来获取水平格式的数据,全部在一行中:

awk -F'(</*t>|</*t>)' 'NF>1{for(i=2;i<NF; i=i+2) printf("%s%s", $i, (i+1==NF)?ORS:OFS)}' OFS=',' demo.xml

运行上述命令后,输出如下 "NAME","Vikas","Vijay","Vilas","AGE","24","34","35","COURSE","MCA","MMS","MBA"

我是如何尝试实现逻辑的

从用户获取参数,他们将有多少个标头值

在上面的 xml 中,它们是 3 个标头 -> NAME,AGE,COURSE

header_count=3

所以 3 个标题意味着将有 3 个值,例如:HEADER + 3 值 NAME,Vikas,Prabhas,Arjun -> 这将转置到下面

输出:

NAME,
Vikas,
Prabhas,
Arjun,

标头值 AGE -> AGE + 3 值也是如此

AGE,25,34,21  will be transpose to vertical 

AGE
25
34
21

标题值也是如此 COURSE -> COURSE + 3

COURSE,MCA,MBA,MMS  will be transpose to vertical 

COURSE
MCA
MBA
MMS

**结合姓名、年龄、课程的所有数据后的预期输出**

NAME,AGE,Course
Vikas,"25",MCA
Prabhash,"34",MBA
Arjun,"21",MMS

【问题讨论】:

  • 请澄清您的问题的标题。您说的是数组,但您发布的代码中没有数组,而且事实上,POSIX shell 也没有数组。

标签: shell unix


【解决方案1】:

使用您展示的示例,请尝试以下操作。在 GNU awk 中编写和测试,应该可以在任何 awk 中工作。

awk '
BEGIN{
  FS=OFS=","
}
{
  for(i=1;i<=NF;i++){
    if($i~/^"NAME"/){
      found1=1
      found2=found3=""
    }
    if($i~/^"AGE"$/){
      found1=found2=""
      found2=1
    }
    if($i~/^"COURSE"$/){
      found1=found2=""
      found3=1
    }
    if(found1){
      name[++count1]=$i
    }
    if(found2){
      age[++count2]=$i
    }
    if(found3){
      course[++count3]=$i
    }
  }
}
END{
  if(count1>=count2 && count1>=count3){ max=count1 }
  if(count2>=count1 && count2>=count3){ max=count2 }
  if(count3>=count1 && count3>=count2){ max=count3 }
  for(i=1;i<=max;i++){
      print (name[i]?name[i]:"NA",age[i]?age[i]:"NA",course[i]?course[i]:"NA")
  }
}
'  Input_file

【讨论】:

  • 过段时间会写解释。
  • 兄弟你能使用序列吗:seq 4 | tr '\n' 以便在每 4 条记录和垂直记录后中断并附加下一个 4
  • :我试过这个命令,但给出 -> 第一列数据如何获取下一条记录数据并将其附加到上述数据
  • @codeholic24,当我测试它时,它对我来说非常好用。您的文件中只有一行,对吗?
  • 对我来说也很有效.. 但我要说的是他们的任何其他方法来做到这一点,而不是在代码中隐含地使用标题,这就是为什么我说我的数据出现在一行水平: "NAME","Vikas","Vijay","Vilas","AGE","24","34","35","COURSE","MCA","MMS","MBA" 这需要在第 4 个值之后拆分为垂直并且与 next 和 append 相同
猜你喜欢
  • 1970-01-01
  • 2014-11-20
  • 1970-01-01
  • 2011-09-23
  • 1970-01-01
  • 2012-04-27
  • 1970-01-01
  • 2012-07-13
  • 1970-01-01
相关资源
最近更新 更多