对任何重复表示歉意,但我遇到的大多数问题都与从行中的字段中获取特定值有关,或者用于从已知的文件中tail
获取尾行n
n
先验。我正在寻找一个值匹配的行,然后获取该行中的所有字段以及所有后续行。详细信息如下。
我有从在线数据库返回的数据文件,其中包含可变数量的元数据标题行,其中包含有关用于搜索数据库的查询条件的信息。在这些标题行之后是一个整洁的数据框。例子:
Query date: February 3, 2020, 1:34:57 PM
Database: <database name>
\n
Search criteria:
\n
Geographic bounding box coordinates: -130.00 20.00; -130.00 24.00; -120.00 24.00; -120.00 20.00
Sample type: rocks > sediments > dust
\n
SAMPLE ID,REFERENCE,LONGITUDE,LATITUDE,X,Y,Z,A
56,Author (YYYY) Title: Journal,-127.3,22,1.7,2.3,0,0.55
56,Author (YYYY) Title: Journal,-127.34,22.4,1.9,1.3,0.5
我已使用以下命令成功找到包含数据字段名称的行:
SID=$(awk -F, '{ if ($1 == "SAMPLE ID") print NR }' data.csv)
echo $SID
回报9
,如预期
现在我想获取该行字段名称以及包含数据的所有后续行并将它们发送到一个新文件。换句话说,我希望解析整个输入文件,并将行发送NR >= $SID
到新文件。
这是我一直在使用的代码,但它只返回几乎所有数据,除了几行。我不明白如何获取我想要的数据,或者为什么它省略了它所在的行。
awk -F, -v r=$SID '{ if (NR >= $r) print $0}' data.csv > output.csv
这是我的预期输出:
SAMPLE ID,REFERENCE,LONGITUDE,LATITUDE,X,Y,Z,A
56,Author (YYYY) Title: Journal,-127.3,22,1.7,2.3,0,0.55
56,Author (YYYY) Title: Journal,-127.34,22.4,1.9,1.3,0.5
任何帮助都会很棒!如果不清楚的话,我对 awk 完全陌生!这意味着我也欢迎任何好的学习入门材料的链接。
答案1
在 awk 中,指的是th$r
的值r
场地,而不是其本身的价值r
。如果您只需替换$r
为以下内容,您的解决方案应该有效r
:
awk -F, -v r=$SID '{ if (NR >= r) print $0}' data.csv
或者(更惯用的是,使用默认打印操作)
awk -F, -v r=$SID 'NR >= r' data.csv
然而,实际上没有必要分两步完成——要么
awk -F, '$1 == "SAMPLE ID" {p=1} p' data.csv
甚至(完全忽略 CSV 结构)
awk '/^SAMPLE ID,/{p=1} p' data.csv
应该也能工作。