从下一行打印值

从下一行打印值

我的文件看起来像这样

User Charts
User ID:
40944827
User Name:
Joe, Neo
Gender:
M
DOB:
3/20/2000 12:00:00 AM - Age: 20 yr. 10 mo. old

我想使用awksed获取以下格式的结果

LastName, First Name,Gender,DOB

Joe,Neo,M,3/20/2000

答案1

假设您的真实输入文件包含超过 1 条记录,例如:

$ cat file
User Charts
User ID:
40944827
User Name:
Joe, Neo
Gender:
M
DOB:
3/20/2000 12:00:00 AM - Age: 20 yr. 10 mo. old
User ID:
1234
User Name:
Bob, Slob
Gender:
X
DOB:
5/28/2000 12:00:00 AM - Age: 20 yr. 10 mo. old

以下是如何将其转换为 CSV,而无需将代码耦合到输入行的值:

$ cat tst.awk
BEGIN { OFS="," }
NR==1   { next }
!(NR%2) { sub(/:.*/,""); hdrs[++numFlds]=$0 }
NR%2    { vals[numFlds]=$0 }
!((NR-1)%8) {
    if ( !doneHdr++ ) {
        for (fldNr=1; fldNr<=numFlds; fldNr++) {
            printf "\"%s\"%s", hdrs[fldNr], (fldNr<numFlds ? OFS : ORS)
        }
    }
    for (fldNr=1; fldNr<=numFlds; fldNr++) {
        printf "\"%s\"%s", vals[fldNr], (fldNr<numFlds ? OFS : ORS)
    }
    numFlds = 0
}

$ awk -f tst.awk file
"User ID","User Name","Gender","DOB"
"40944827","Joe, Neo","M","3/20/2000 12:00:00 AM - Age: 20 yr. 10 mo. old"
"1234","Bob, Slob","X","5/28/2000 12:00:00 AM - Age: 20 yr. 10 mo. old"

这并不完全是您正在寻找的输出,但它实际上可能对您更有用,希望您可以看到它只是循环中的一个调整,for以根据数据值做出任何决策并更改所选字段的输出随你便。

答案2

这是 awk 的解决方案,因为这就是您所要求的。该解决方案对于数据文件中的任意数量的记录都有效,称为datafile

$ awk 'BEGIN {print "FirstName,LastName,Gender,DOB"}
       /User Name:|Gender:/ {dob=0;rtp=NR+1} 
       NR==rtp && dob==0 {printf $1 $2 ","} 
       /DOB:/ {dob=1;rtp=NR+1} 
       NR==rtp && dob==1 {print $1}' datafile
[output]
FirstName,LastName,Gender,DOB
Joe,Neo,M,3/20/2000

1号线:打印输出的标题:“名字,姓氏,性别,出生日期”

2号线:如果记录包含“用户名:”或“性别:”,则将内部变量 dob 和 rtp 分别设置为 0 和 NR+1。

3号线:如果记录号为rtp且dob为0,则打印两个第一个字段(如果它们非空)

4号线:如果记录包含“DOB:”,则将内部变量 dob 和 rtp 分别设置为 1 和 NR+1。

5号线:如果记录号是 rtp 并且 dob 是 1,则打印第一个字段。

答案3

您可能想看一下磨坊主。与 awk 一样,它具有记录和字段的内置概念 - 但与 awk 不同的是,它本身也处理键值对。

前任。

mlr --idkvp --irs '\0' --ifs '\n' --ips ':\n' --ocsvlite put -S '
  u = splitnvx(${User Name},", "); $FirstName = u[1]; $LastName = u[2]; 
  d = splitnvx($DOB," "); $DOB = d[1]
' then cut -o -f 'FirstName,LastName,Gender,DOB' file
FirstName,LastName,Gender,DOB
Joe,Neo,M,3/20/2000

答案4

这是 sed 的解决方案:

sed -e 'N;N;N;N;N;N;N;N;s/.*Name:\n\([^[:space:]]*, [^[:space:]]*\)\nGender:\n\(.\)\nDOB:\n\([^[:space:]]*\).*/LastName, First Name,Gender,DOB\n\n\1,\2,\3/'  

我认为输出应该看起来更像这样:;-)

sed -e 'N;N;N;N;N;N;N;N;s/.*Name:\n\([^[:space:]]*, [^[:space:]]*\)\nGender:\n\(.\)\nDOB:\n\([^[:space:]]*\).*/LastName, FirstName, Gender, DOB\n\n\1, \2, \3/'  

相关内容