首页 > 解决方案 > Bash循环通过CSV但用换行符留下最后一行值

问题描述

我有循环的情况。我的任务是从 csv 数据创建带有循环的 json 文件。不幸的是,当我生成字段 pk 时,该值为空,导致我的 json 错误。这是我的 csv 的子集

table,pk
aaa,nik
aab,ida
aac,idb
aad,idc
aae,idd
aef,ide
...

这是我的完整代码:

#!bin/bash
CSV_LIST="/home/admin/kafka/main/config/tables/table_lists.csv"
DATA=${CSV_LIST}

mkdir sqlconn 
cd sqlconn
cat ${DATA} |
while IFS=',' read table pk ; do
    PK= echo ${pk} | tr -d '\n'
    cat > ./sqlservercon_$table.json << EOF 
    {"name" :"sqlservercon_$table","config":{"connector.class":"io.confluent.connect.jdbc.JdbcSinkConnector","topics":"$table",

...

,"pk.fields":" $PK","pk.mode":"record_value","destination.table.format":"db.dbo.$table","errors.tolerance":"all","flush.size":"10000"
}}

EOF

done

所以渲染的结果给了我这个:

    {"name" :"sqlservercon_XXX","config":{"connector.class":"io.confluent.connect.jdbc.JdbcSinkConnector","topics":"XXX",...
,"pk.fields":" ","pk.mode":"record_value","destination.table.format":"db.dbo.XXX","errors.tolerance":"all","flush.size":"10000"
}}

但是当我没有编辑我的字段 pk

...,
"pk.fields":" $pk",
...

,它给了我这样的错误 JSON 文件:

...,"pk.fields":" id
",...

任何帮助表示赞赏

更新

当我使用最后一列检查我的 csv 时cat -v table_lists.csv,有 ^M 字符会破坏 json 文件。但我仍然不知道如何处理它。

标签: jsonbash

解决方案


关于我给出的评论,以下脚本正在运行

#!/bin/bash

cd /home/test

CSV_LIST="/home/test/tableList.csv"
DATA=${CSV_LIST}

# Prepare data file     
sed -i "s/\r//g" ${DATA}

# Added for debugging purpose
echo "Creating connection file in JSON for"

# Print file content from 2nd line only
tail --lines=+2 ${DATA} |
while IFS=',' read TABLE PK ; do

    # Added for debugging purpose
    echo "Table: ${TABLE} and PK: ${PK}"

    # Added missing $()
    PK_TRIMMED=$(echo ${PK} | tr -d '\n')

    cat > ./sqlservercon_${TABLE}.json << EOF
    {"name":"sqlservercon_${TABLE}","config":{"connector.class":"io.confluent.connect.jdbc.JdbcSinkConnector","topics":"${TABLE}",...,"pk.fields":"${PK_TRIMMED}","pk.mode":"record_value","destination.table.format":"db.dbo.${TABLE}","errors.tolerance":"all","flush.size":"10000"}}
EOF

done

推荐阅读