带空格的CSV两列列表。在两个单独的变量中需要之前或之后的所有内容

时间:2014-12-19 13:00:05

标签: bash shell csv awk cut

我有一个两列的CSV列表(col1是Share Name,col2是文件系统路径)。我需要两个变量用于逗号之前的所有内容,或列之后的所有内容。我的问题是任何一列都可能有空格,即使输出中引用了这些空格,我的脚本也没有正确处理它们。

CSV:
共享名,/路径/到/共享名
“与空格共享”,/ path / to / sharewithspaces
ShareWithSpace,“/ path / to / share with spaces”

我使用这个awk语句获取字段1或字段2:

echo $line | awk -F "\"*,\"*" '{print $2}'

但是,我很快意识到它没有正确处理空间,即使将该命令传递给变量并引用变量也是如此。

所以,然后在搜索我的大脑后,我正在尝试这个:

echo $line | cut -d, -f2

哪个有效,在回显变量$ line时除外。如果我回显字符串,它可以很好地工作,但不幸的是我正在使用它/ read / do。

我相当肯定我的问题是必须定义字段并有空格,但我真的只需要在逗号之前或之后。

这是精简版本,因此没有敏感数据。

#!/usr/bin/bash  

ssh <ip> <command> > "2_shares.txt"  

<command> > "1_shares.txt"  



file1="1_shares.txt"  
file2="2_shares.txt"  


while read -r line  
do  
  share=`echo "$line" | awk -F "\"*,\"*" '{print $1}'`  
  path=`echo "$line" | awk -F "\"*,\"*" '{print $2}'`  
    if grep "$path" $file2 > /dev/null;  
      then  
        :  
      else  
        echo "SHARE NEEDS CREATED FOR $line"  
        case $path in  
          *)  
          blah blah blah  
          ;;  
        esac  
    fi  
done < "$file1"  

2 个答案:

答案 0 :(得分:2)

你可以这样做,

awk -F',' '{print $2}' file

跳过第一行。

awk -F',' 'NR>1{print $2}' file

答案 1 :(得分:0)

您的问题只是您没有引用shell变量。总是引用shell变量,除非你有一个非常具体的理由不完全了解所有后果。

我强烈怀疑你的脚本的其余部分在它的方法中是完全错误的,因为你显然不知道引用变量并且正在讨论shell循环并且一次回应一行到awk因此请发布一个后续问题如果你我喜欢帮助。