awk输出csv文件格式语法

时间:2014-06-18 14:40:09

标签: awk

我正在尝试使用awk从多个文本文件中提取数据。

我试图获取我想要的输出文件时遇到障碍。

我尝试了很多使用OFS和ORS无效的实例......

输入文本文件始终具有相同的结构,字段不会更改,只有数据值。

  • 文本输入文件文件名示例: FCS0702_N4_S2_AAI135H_IORevInf.txt

  • 文本输入文件示例:

    I/O Module:
    Line : 1 Node : 4 Slot : 2 Type : AAI135H
    0000    0000 2000 0000 C000  C000 8000 4400 AAA0    .. .........D...
    0010    AA55 000F 4CCC 1000  0FF4 0000 0E01 0E01    .U..L...........
    0020    0000 0000 0000 0000  0000 0000 0000 0000    ................
    0030    00D9 0000 0000 0000  0000 0000 0000 0000    ................
    0040    0010 0D00 0814 2000  0B00 03DC 0088 0000    ...... .........
    0050    0000 0100 1010 0000  0000 4010 0000 0160    ..........@....`
    0060    0000 0000 0400 8008  0000 0000 8008 0000    ................
    0070    0000 0000 0000 0000  0000 0000 0000 0000    ................
    0080    0000 0000 0000 0000  0B10 0B5C 0B74 0BB0    ...........\.t..
    0090    0BC8 0BFC 0C3C 0000  A5D7 003C 4141 4931    .....<.....<AAI1
    00A0    3335 2D48 3030 2020  5332 5532 4830 302D    35-H00  S2U2H00-
    00B0    4631 2D2D 4333 4743  3330 3733 3347 2020    F1--C3GC30733G  
    
  • 所需的CSV输出文件:

    FCS0702_N4_S2_AAI135H_IORevInf.txt,Line1,Node4,Slot2,TypeAAI135H,AAI135-H00S2,U2H00-F1--,C3GC30733G
    
  • 当前的awk脚本:

    #!/bin/sh
    touch output.csv
    for inputfile in *.txt
    do
    echo $inputfile >>output.csv
    ### awk 'NR==2 {printf $0}' "$inputfile" >>output.csv
    awk NR==2 {printf substr($0,1,4)}'  "$inputfile" >>output.csv
    awk NR==2 {printf substr($0,8,1)}' "$inputfile" >>output.csv
    awk NR==2 {printf substr($0,10,4)}' "$inputfile" >>output.csv
    awk  NR==2 {printf substr($0,17,1)}' "$inputfile" >>output.csv
    awk NR==2 {printf substr($0,19,4)}' "$inputfile" >>output.csv
    awk NR==2 {printf substr($0,26,1)}' "$inputfile" >>output.csv
    awk NR==2 {printf substr($0,28,4)}' "$inputfile" >>output.csv
    awk NR==2 {printf substr($0,35,7)}' "$inputfile" >>output.csv
    awk NR==12 {printf substr($0,60,4)}' "$inputfile" >>output.csv
    awk NR==13 {printf substr($0,48,6)}' "$inputfile" >>output.csv
    awk NR==13 {printf substr($0,56,7)}' "$inputfile" >>output.csv
    awk NR==14 {print substr($0,48,16)}' "$inputfile" >>output.csv
    done
    

如前所述,我尝试过多次OFS和ORS尝试,但无济于事......

    awk 'BEGIN{ORS=","} NR==2 {printf substr($0,1,4)}'  "$inputfile" >>output.csv 

不起作用。

    awk -v ORS="," NR==2 {printf substr($0,1,4)}'  "$inputfile" >>output.csv

不起作用。

我已经尝试了许多我忘记过的事情。

通过谷歌搜索并没有真正帮助,也没有找到文档。

我想我需要一个例子,对不起,真的挂了这个,出于某种原因,感叹......

2 个答案:

答案 0 :(得分:1)

以下命令将输出您想要的输出。

awk '
BEGIN {printf "%s,", "'"$inputfile"'"}
NR==2 { gsub(/ : /, ""); gsub(/ /, ","); printf "%s,", $0 }
NR==12 { printf "%s", substr($0,60,4) }
NR==13 { printf "%s,%s", substr($0,47,6), substr($0,56,7) }
NR==14 { printf "%s,%s\n", substr($0,47,4), substr($0, 51,12) }
' $inputfile

函数printf将格式作为第一个参数。您应该避免将输入数据作为第一个参数传递,因为它可能包含转换说明符。

答案 1 :(得分:0)

OFS控制$0中的字段之间的内容(当它从修改的字段重新计算时)awk打印它时的内容以及print的各个参数之间的内容。如果您明确打印一个值,并且只显示一个值,则OFS永远不会发挥作用。

另一方面,

ORS控制awk在print输出行的末尾打印的内容。

请注意以上这些描述中是否都没有谈到printf?那是因为printf没有做到这两件事。

首先,您应该将这些十几个awk调用合并到一个awk脚本中。

然后您需要开始直接替换行中的字段(通过直接修改$1或修改$0并使用$1=$1或类似方法强制awk重新计算{ {1}})然后使用$0或者您需要开始使用print