我正在尝试使用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
不起作用。
我已经尝试了许多我忘记过的事情。
通过谷歌搜索并没有真正帮助,也没有找到文档。
我想我需要一个例子,对不起,真的挂了这个,出于某种原因,感叹......
答案 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
。