【发布时间】:2018-12-11 03:54:15
【问题描述】:
我正在破解一些 AWK。我是它的初学者。我已经完成了以下问题的作业,但无法解决。
原始数据样本:
Start Date 12/3/17
End Date 12/30/17
Report Type Report1
Currency ZAR
Country Identifier MType Quantity Net Net Net Code Title Contrib I_Type M_Type Vendor Identifier Offline Indicator LSN
ZA 44057330 FMP 1 0.050666 0.050666 USYYYYYYYYYY ABC Tom 1 1 USYYYYYYYYYY 0 SUT
ZA 1267456726 SIMT 1 0.03 0.03 USXXXXXXXXXX DEF Frances 1 1 USXXXXXXXXXX 0 XYZ
Row Count 657
Storefront Name MType Quantity Net Net
ZA FMP 601 30.45
ZA IAP 13 0.68
ZA IMP 1035 69.36
ZA SIMP 54 1.4
ZA FMT 70 0.53
ZA IMT 92 1.68
ZA SIMT 6 0.18
期望的输出:
(我在这里没有转义特殊字符。)
"Filename" "Start Date" "End Date" "Currency" "Country" "Identifier" "MType" "Quantity" "Net" "NetNet" "Code" "Title" "Contrib" "I_Type" "M_Type" "Vendor Identifier" "Offline Indicator" "LSN"
"rawfile.txt" "12/3/17" "12/30/17" "ZAR" "ZA" "44057330" "FMP" "1" "0.050666" "0.050666" "USYYYYYYYYYY" "ABC" "Tom" "1" "1" "USYYYYYYYYYY" "0" "SUT"
"rawfile.txt" "12/3/17" "12/30/17" "ZAR" "ZA" "1267456726" "SIMT" "1" "0.03" "0.03" "USXXXXXXXXXX" "DEF" "Frances" "1" "1" "USXXXXXXXXXX" "0" "XYZ"
基本上我只需要从第 5 行获取大部分标题,但我需要的三个字段位于第 1-4 行。另外,我不需要以“行数”开头的行和之后的数据。
迄今为止我的最佳“猜测”:
gawk '
function basename(file) {
sub(".*/", "", file)
return file
}
/^Row Count/ {nextfile}
FNR == 1 { StartDate=$2; }
FNR == 2 { EndDate=$2; }
FNR == 4 { curr=$2; }
NR == 5 {$0 = "StartDate" OFS "EndDate" OFS "Filename" OFS "curr" OFS $0; print}
FNR > 5 {$0 = StartDate OFS EndDate OFS basename(FILENAME) OFS curr OFS $0; print}
' OFS='\t' path/to/sourcefiles/*.txt > path/to/outfile.txt
谢谢!
编辑:
新表
这些是每个文件中字段标题之前的行。内容从第 4 行开始:
Provider ,,,,,,,,,,,,
01/01/2018 - 01/31/2018,,,,,,,,,,,,
“我的”脚本
它几乎可以工作。但它包括每个文件的第 1-3 行: 傻瓜' 功能基本名称(文件){ 子(“.*/”,“”,文件) 返回文件 } 开始 { FS=OFS="," } NR 3 { 打印“文件名”,hdr $0 下一个 } { 打印基本名称(文件名),价值 $0 } ' OFS="," /path/to/input/files > ~/path/to/output/file/file.csv
编辑结束
【问题讨论】:
-
“原始数据示例”中的那些
\ts 真的存在还是应该代表制表符?日期中的每个正斜杠之前是否有真的反斜杠?请确保您发布的示例输入正是您要解析的输入格式。
标签: awk