
#檔名為$1
#企業名稱為 $2
#updated in theyear $3 #它可以匹配引號值內的任何逗號,只要它位於匹配郵遞區號的 V 之前即可。它們都以 V 開頭。
./script6_1.sh bcindigenousbusinesslistings.csv“B.*”2021
尋找2020年或以後更新的所有以B開頭的商家。
#第一個 sed 是從第 2 行到最後一行 #第二個 sed : 在行的開頭,它可以匹配任何模式,直到 V(郵政編碼)然後它將停止 $3 將匹配任何數字最後一位數字的模式為20(1 到3) 和(0-9)
*sed -n '2,$p' $1 | sed -e 's/^\('$2'[^,]*,[^,]*,[^,]*,.*[^V],\)\('$3'202[0-9]\)/\1\2/'*
重點是提取 3 列,每列用逗號分隔。業務、說明、地址。最後一欄是更新年份。在列描述內,可能有更多逗號分隔。
我在這方面遇到錯誤,因為它只是列印出所有行,而不提取匹配的模式。
答案1
如果您想使用一行內的列而不是整行,那麼awk
或perl
將是比 更好的工具sed
。
而且,由於您需要處理帶有引號的欄位(其中包含逗號),因此最好使用它,perl
因為它有一個文字::CSV像這樣解析 CSV 檔案的模組。您可以使用 來做到這一點awk
,但您必須編寫自己的解析器來處理欄位內的引號和逗號。
如果您運行的是 Debian 或類似版本,請使用apt install libtext-csv-perl
.其他發行版可能也打包了它。否則,請使用cpan
.
以下是一個相當簡單的範例,說明您可以使用Text::CSV
.運行man Text::CSV
以獲取詳細資訊。
#!/usr/bin/perl
use strict;
use Text::CSV qw(csv);
my ($filename, $search, $year) = @ARGV;
my $csv = Text::CSV->new({allow_whitespace => 1,
allow_loose_quotes => 1,
quote_space => 0,
});
open(my $in, "<", $filename) or die "couldn't open $filename: $!";
my @headers = $csv->header($in);
pop @headers; # discard last field from @headers
$csv->say(*STDOUT, \@headers); # print the headers
while (my $row = $csv->getline($in)) {
# note: perl arrays start from zero, not one. So $row->[0] is
# the first field. $row->[3] is the fourth.
if ($row->[0] =~ m/$search/i && $row->[3] == $year) {
pop @{ $row }; # discard last field (year)
$csv->say(*STDOUT, $row);
}
}
close($in);
將其另存為,例如,extract.pl
並使用 - 使其可執行,chmod +x extract.pl
與 shell 腳本相同。
您沒有在問題中給出示例輸入或輸出,所以我不得不編造一些廢話。
給定以下輸入檔input.csv
:
business,description,address,year
"ABC","sells some items","123 Somewhere Street, Somewhere, V1234",2020
"BCD Co.","sells some items","123 Somewhere Street, Somewhere, V1234",2021
"BBB Pty Ltd","sells some items","123 Somewhere Street, Somewhere, V1234",2020
"BXYZ","sells some items","123 Somewhere Street, Somewhere, V1234",2021
"CDE","sells some items","123 Somewhere Street, Somewhere, V1234",2020
"DEF","sells some items","123 Somewhere Street, Somewhere, V1234",2020
它將產生以下輸出:
$ ./extract.pl input.csv '^b' 2021
business,description,address
BCD Co.,sells some items,"123 Somewhere Street, Somewhere, V1234"
BXYZ,sells some items,"123 Somewhere Street, Somewhere, V1234"
即 2021 年以「B」或「b」開頭的所有企業名稱(正規表示式匹配不區分大小寫)。
請注意輸出如何僅在必要的地方(即字段內有逗號的地方)引用字段。如果您也希望包含空格的欄位也被引用,請在腳本中變更quote_space => 0
為quote_space => 1
(或刪除該行,因為使用空格引用欄位是預設的Text::CSV
)