如何使用awk将以下文本转换为逗号分隔列表 - 需要跳过标题和预告片

时间:2014-05-12 19:43:44

标签: csv text awk

+---------------------------------+------------+------+----------+
| Name | NumCourses | Year | Semester |
+---------------------------------+------------+------+----------+
| ABDULHADI, ASHRAF M | 2 | 1990 | 3 |
| ACHANTA, BALA | 2 | 1995 | 3 |
| ACHANTA, BALA | 2 | 1996 | 3 |
+---------------------------------+------------+------+----------+
648 rows in set (0.02 sec)
--------------------------

跳过前3行和后两行。我需要一个像 -

这样的输出
ABDULHADI, ASHRAF M, 2, 1990, 3
ACHANTA, BALA, 2, 1995, 3
ACHANTA, BALA, 2, 1996, 3

2 个答案:

答案 0 :(得分:0)

您可以从这个awk开始,并根据需要进行构建。

awk '
BEGIN {
    FS = " *[|] *"              # Set the Field Separator to this pattern
    OFS = ","                   # Set the Output Field Separator to ,
}
NF {                            # Skip blank lines
    $1 = $1                     # Reconstruct your input line
    gsub(/^,|,$/,"")            # Remove leading and trailing ,
    lines[++i] = $0             # Add line to array
}
END {
    for(x=4;x<=i-2;x++)         # Skip first three and last two lines
        print lines[x]          # Print line
}' file
ABDULHADI, ASHRAF M,2,1990,3
ACHANTA, BALA,2,1995,3
ACHANTA, BALA,2,1996,3

如果您的数据没有空白行,那么您可以删除NF并使用NR代替++i

上面的

FS模式是零或更多空格后跟管道(放在字符类中以考虑它是文字的,因为它是一个元字符)后面跟着零个或多个空格。

答案 1 :(得分:0)

这是awk

awk -F" *[|] *" 'FNR==NR {a=FNR;next} FNR>3 && FNR<a-2 {print $2,$3,$4,$5}' OFS=", " file{,}
ABDULHADI, ASHRAF M, 2, 1990, 3
ACHANTA, BALA, 2, 1995, 3
ACHANTA, BALA, 2, 1996, 3

读取文件两次,一次计算行数,一次读取正确的输出 如果您的awk无法与file{,}一起使用,请更改为file file以便阅读两次