bash CSV最后一栏

时间:2017-10-27 13:38:58

标签: bash

我有像这样的格式的csv

 John|Mayer   
 Bill|Potter
 ...

脚本是:

cat names.csv | while read line
 do
    name=$( echo $line | cut -d'|' -f1 )     # get the first name
    surname=$( echo $line | cut -d'|' -f2 )    # get the surname      

echo "$surname"
echo "Your name is: $name and surname is: $surname"
done

姓氏回声正在起作用,我得到名单(Mayer Potter ......)。 但是当我在其他一些环境中使用它作为变量时它不起作用(并且姓氏是:$ surname“)

2 个答案:

答案 0 :(得分:0)

这是因为在bash命令中,arround管道|在子进程中执行,

所以在done当前shell环境与命令之前相同

之后

见:

declare -p BASHPID  
declare -p BASHPID  >&2 | declare -p BASHPID >&2

这可以使用输入重定向而不是cat |

来解决
while read line
do
...
done < names.csv 

它也避免了产生两个进程并创建一个管道

答案 1 :(得分:0)

将我的评论转换为答案。

你的循环中几乎没有问题:

  1. 不必要地使用cat和管道,因为它会分叉子壳
  2. 使用cut
  3. 可以在循环中不必要地使用IFS两次

    你可以使用这个循环:

    while IFS='|' read -r fname lname; do
        declare -p fname lname
        # or do processing with $fname, $lname here
    done < names.csv