如何在bash中更快地操作这个CSV?

如何在bash中更快地操作这个CSV?,bash,csv,Bash,Csv,我有一个类似这样的CSV数据,名为brands\u url "relative/url","brand" "relative/url1","brand" 我想使用第二列brand的值,通过使用此命令行查找该品牌的域名 curl url.json | jq -r '.[] | select(.slug=="brand") | .domain.production' # this would produce >> www.domain.com 我想用这个结果作为第一列的前置,所以最终

我有一个类似这样的CSV数据,名为
brands\u url

"relative/url","brand"
"relative/url1","brand"
我想使用第二列brand的值,通过使用此命令行查找该品牌的域名

curl url.json | jq -r '.[] | select(.slug=="brand") | .domain.production' # this would produce >> www.domain.com
我想用这个结果作为第一列的前置,所以最终结果是这样的

"www.domain.com/relative/url"
"www.domain.com/relative/url1"
我的脚本现在的问题是速度很慢

BRAND_JSON=$(curl url.json) 

while IFS= read -r line
do
  BRAND=$(echo $line | awk -F',' '{print $2}' | sed "s/\"//g")
  URI=$(echo $line | awk -F',' '{print $1}' | sed "s/\"//g")
  echo $BRAND
  DOMAIN=$(echo $BRAND_JSON | jq -r ".[] | select(.slug==\"$BRAND\") | .domain.production")
  echo $DOMAIN
  echo $URI
  echo "https://$DOMAIN/$URI" >> urls
done < "brand_urls"

只需使用参数扩展和删除子字符串,就可以消除80%的子shell开销。只需让bash处理对行的解析,就可以替换对
awk
sed
(以及每个
“|”
所需的子shell)的4个调用,例如

while IFS= read -r line
do
    BRAND=${line%\"}
    BRAND=${BRAND##*\"}
    URI=${line#\"}
    URI=${URI%%\"*}
    echo $BRAND
    DOMAIN=$(echo $BRAND_JSON | jq -r ".[] | select(.slug==\"$BRAND\") | \
    .domain.production")
    echo $DOMAIN
    echo $URI
    echo "https://$DOMAIN/$URI" >> urls
done < "brand_urls"
当IFS=read-r行时
做
品牌=${line%\“}
品牌=${BRAND##*\“}
URI=${line#\“}
URI=${URI%%\“*}
echo$品牌
DOMAIN=$(echo$BRAND_JSON | jq-r.[]| select(.slug=\“$BRAND\”)|\
.domain.production)
echo$域
echo$URI
echo“https://$DOMAIN/$URI”>>URL
完成<“品牌URL”

试试看,让我知道。剩下的大部分时间将用于通过
curl
进行外部信息检索,bash对此无能为力。

jq+awk工具的简短组合:

示例
url.json
(应为有效的json):


示例
brands\u url.csv
内容:

"relative/url","brand"
"relative/url1","brand1"

工作:

awk -F, 'NR==FNR{ gsub(/"/,""); a[$2]=$1;next }
         $2 in a{ printf "https://%s/%s\n",$1,a[$2] }' brands_urls.csv \
         FS='\t' <(jq -r '.[] | [.domain.production,.slug] | @tsv' url.json)

这可能是通过awk实现的,而无需明确阅读每一行。我不知道如何做到这一点。您能帮忙吗?您能分享$BRAND_JSON输出的格式吗?。这可以用awkYou很快完成。你只生产了一些
18
子壳,你期待什么?@toy,是的,只需
jq
+
awk
就可以了。目前我有大约40000行,大约需要6分钟。我猜这是因为这行代码DOMAIN=$(echo$BRAND|u JSON|jq-r.[]\124; select(.slug=\“$BRAND\”)))\124;\.DOMAIN.production)太慢了?是的,bash在这行代码中什么都做不了。问题是,当您调用
curl url.json
时,
curl
执行在线查找所需的时间。如果我处在你的位置,我会寻找一种更快的方式来获取你需要的在线信息。(我不怎么从网上获取信息,但我会检查一些工具,如
whois
和其他信息工具,看看是否可以做
curl
做得更快的事情。
"relative/url","brand"
"relative/url1","brand1"
awk -F, 'NR==FNR{ gsub(/"/,""); a[$2]=$1;next }
         $2 in a{ printf "https://%s/%s\n",$1,a[$2] }' brands_urls.csv \
         FS='\t' <(jq -r '.[] | [.domain.production,.slug] | @tsv' url.json)
https://www.\domain.com/relative/url
https://www.\domain1.com/relative/url1