Shell

查找包含字元串的行,然後使用 awk 返回該行和文本文件的所有後續行

  • February 13, 2020

對任何重複表示歉意,但我遇到的大多數問題都與從連續欄位中獲取特定值有關,或者用於從文件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 完全陌生!這意味著我也歡迎任何好的學習介紹材料的連結。

在 awk 中,$r將引用r第 th 欄位的值,而不是其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

應該也可以。

引用自:https://unix.stackexchange.com/questions/567288