linux 改为将多行写入列

ma8fv8wu  于 2023-01-20  发布在  Linux
关注(0)|答案(1)|浏览(95)

我有一个错误报告,其中包含大量的电话号码,我需要看看是否有任何这些数据存在于我们的数据库。
所需资料─
电话号码-路由代码-客户ID
我使用的API可以从各种来源收集数据。
第一个请求是使用我们已经知道的电话号码来获取相同的电话号码,这样我就可以在终端中打印它。这很愚蠢,也浪费资源,但我不知道如何只打印查询数据库时有有效响应的电话号码。

curl -s -X GET "http://number.com/api/v1/telephone-number/$rec1" -H  "accept: application/json" -H  'X-API-Key: APIKEY'

原始响应

{
"status": "success",
"data": {
    "telephone_number": {
        "telephone_number": 11111111111,
        "account_reference": "CS039890",
        "unavailable_until": null,
        "links": {
            "self": "\/api\/v1\/telephone-number\/11111111111",
            "range_holder": "\/api\/v1\/communications-provider\/5237",
            "current_provider": "\/api\/v1\/communications-provider\/5237",
            "value_tier": "\/api\/v1\/value-tier\/ed4b60b9"
        }
    }
}

我添加了一个过滤器,只显示电话号码。

| grep telephone_number | sed 's/^[^0-9]*//' | tr -d ','

过滤响应-

11111111111

接下来,我要得到号码的路由码-

curl -s -X GET "http://number.com/api/v1/portability/route/$rec1" -H  "accept: application/json" -H  'X-API-Key: APIKEY'

原始响应-

{
    "status": "success",
    "data": {
        "portability_route": {
            "telephone_number": 11111111111,
            "nppc": 521393
        }
    }

我又加了一个过滤器只显示路由代码-
| 格勒普核电站|sed的/^[^0-9]*//'
滤波输出-

521393

最后,我需要找回顾客的身份证-

curl -s -X GET "http://number.com/api/v1/telephone-number/$rec1" -H  "accept: application/json" -H  'X-API-Key: APIKEY'

原始响应-

"status": "success",
"data": {
    "telephone_number": {
        "telephone_number": 11111111111,
        "account_reference": "CS039890",
        "unavailable_until": null,
        "links": {
            "self": "\/api\/v1\/telephone-number\/11111111111",
            "range_holder": "\/api\/v1\/communications-provider\/5237c92e",
            "current_provider": "\/api\/v1\/communications-provider\/5237c92e",
            "value_tier": "\/api\/v1\/value-tier\/ed4b60b9"
        }
    }
}

加上过滤器-

| grep CS | sed 's/^.*CS/CS/' | tr -d '"' | tr -d ','

滤波输出-

CS039890

所以最终的输出是这样的-

11111111111
521393
CS039890

在这一点上,我卡住了如何将这些数据组合成一个由逗号分隔的单行,并将其导出到一个文件。可能有10 k+的数字要处理,所以每个结果将需要写入一个新的行。

11111111111,521393,CS039890
11111111112,521393,CS039891

完整的代码-

#Cleanup
rm Output/temp*.* 2> /dev/null

#Check file exists and removes underscores 
if tail -n +2 Input/Errors*.csv | tr -d \_ > Output/temp.csv ; then
 echo ""
 echo "Input File Found!"
 echo " "
else
 echo ""
 echo "Error - Input file is missing!"
 echo ""
 exit
fi

#Remove leading 0 from the third column 
awk 'BEGIN{FS=OFS=","}{sub(/^0/, "", $3)}1' Output/temp.csv >> Output/temp2.csv

#Add headers to file 
sed -i '1iError Code, Calls, A Number, B Number, Customer, Area, Cost, NPPC, CS' Output/temp.csv

#Read Telephone numbers from column 3 in file temp2.csv
while IFS="," read -r rec1
do
  #echo "$rec1"
  curl -s -X GET "http://number.com/api/v1/telephone-number/$rec1" -H  "accept: application/json" -H  'X-API-Key: APIKEY'  | grep telephone_number | sed 's/^[^0-9]*//' | tr -d ','

  curl -s -X GET "http://number.com/api/v1/portability/route/$rec1" -H  "accept: application/json" -H  'X-API-Key: APIKEY' | grep nppc | sed 's/^[^0-9]*//' # >> Output/NPPC.txt

  curl -s -X GET "http://number.com/api/v1/telephone-number/$rec1" -H  "accept: application/json" -H  'X-API-Key: APIKEY'  | grep CS | sed 's/^.*CS/CS/' | tr -d '"' | tr -d ','
done < <(cut -d "," -f3 Output/temp2.csv | tail -n +2)
qvtsj1bj

qvtsj1bj1#

使用command substitution:通过将该命令放在$(...)中,您可以运行该命令并将其输出捕获到一个变量中,您可以根据需要使用该变量。
只执行一次curl调用,并将结果保存在变量中:

curled="$(curl -s -X GET "http://number.com/api/v1/telephone-number/$rec1" -H  "accept: application/json" -H  'X-API-Key: APIKEY')"

然后在grep中使用该变量,并将结果存储在另一个变量中:

phone="$(echo "$curled" | sed 's/^[^0-9]*//' | tr -d ',')"
nppc="$(echo "$curled" | grep nppc | sed 's/^[^0-9]*//')"
cs="$(echo "$curled" | grep CS | sed 's/^.*CS/CS/' | tr -d '"' | tr -d ',')"

然后echo这些你喜欢:

echo "$phone,$nppc,$cs" > output-file.csv

也就是说,您还可以研究jq来解析JSON。sedgrep可能非常脆弱。

相关问题