繁体   English   中英

来自 CSV 和 awk 的 Bash 数组

[英]Bash array from CSV and awk

我正在尝试使用以下命令在 BASH 中创建一个数组:

# Normally a loop, but for this example, n=1
arr=( `awk 'NR == n' n=1 "$file" | tr ',' " "` );
echo ${arr[@]};
echo ${arr[2]};

$file包含:

"1","test_id = \"5\"","test_id <> \"5\""
"2","test_id = \"6\"","test_id <> \"6\""

输出:

"1" "test_id = \"5\"" "test_id <> \"5\""
"test_id

我期望${arr[2]}输出是test_id <> "5"但我实际上得到了"test_id

但是,当我像这样手动输入数据时,我得到了正确的结果:

arr=( "1" "test_id = \"5\"" "test_id <> \"5\"" );
echo ${arr[@]};
echo ${arr[2]};

输出:

1 test_id = "5" test_id <> "5"
test_id <> "5"

任何帮助,将不胜感激,

谢谢。

正确答案当然在评论中:使用真正的 CSV 解析器。 话虽如此,这将是一种人为的解决方法:

. <(
      echo "arr=(";
      awk -F, 'NR==n && $1=$1' n=1 file
      echo ")"
)

获取这个过程替换的结果微妙地改变了引用解释阶段发生的顺序。 它通常有助于解决这些复杂的问题。 啊,为了摆脱不必要的tr调用,awk 被指示在逗号上拆分。 $1=$1总是结果为真,并导致 awk 重新评估其行,因此输入字段分隔符更改为输出字段分隔符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM