Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在bash中修改csv的列_Bash_Csv - Fatal编程技术网

如何在bash中修改csv的列

如何在bash中修改csv的列,bash,csv,Bash,Csv,编辑,这是我按照建议修改完整文件的方式。 它仍然没有按预期工作:第4列在标准输出中打印为空值,并且myCSV.csv未被应用的函数更改: #!/bin/bash function dec2ip() { local ip dec=$@ for e in {3..0} do ((octet = dec / (256 ** e) )) ((dec -= octet * 256 ** e)) ip+=$delim$octet

编辑,这是我按照建议修改完整文件的方式。 它仍然没有按预期工作:第4列在标准输出中打印为空值,并且myCSV.csv未被应用的函数更改:

#!/bin/bash

function dec2ip() {
   local ip dec=$@
   for e in {3..0}
      do
         ((octet = dec / (256 ** e) ))
         ((dec -= octet * 256 ** e))
         ip+=$delim$octet
         local delim=.
      done
# printf '%s\n' "$ip"
}
dec2ip "$@"


decimal_subnets=( $(cut -d ',' -f4 /test/myCSV.csv ) )

echo ${#decimal_subnets[@]}

(
# print the header untouched
read line; echo "$line"
IFS=,
while read -ra fields; do
    fields[3]=$(dec2ip "${fields[3]}")
    echo "${fields[*]}" >> /test/myCSV_dotted.csv
done
) < /test/myCSV.csv
示例输入为:

VLAN ID,NAME,DESCRIPTION,SUBNET 
11,txt1,txt2,123456
12,txt3,txt4,789012
13,txt5,txt6,345678
函数
dec2ip()
似乎没有提供正确的结果:我缺少什么

( 
    # print the header untouched
    read line; echo "$line"
    IFS=,
    while read -ra fields; do 
        fields[3]=$(dec2ip "${fields[3]}")
        echo "${fields[*]}"
    done 
) < myCSV.csv

别忘了在dec2ip函数中将
delim
设为local

这是有效的代码版本,即
myCSV\u new.csv
正确修改了第4列的输出文件:

dec2ip () {
local ip dec=$@
   for e in {3..0}
      do
         ((octet = dec / (256 ** e) ))
         ((dec -= octet * 256 ** e))
         ip+=$delim$octet
         local delim=.
      done
printf '%s\n' "$ip"
}

(
    # print the header untouched
    read line; echo "$line" >> /test/myCSV_new.csv
    IFS=,
    while read -ra fields; do
       fields[3]=$(dec2ip "${fields[3]}")
       echo "${fields[*]}" >> /test/myCSV_new.csv
    done
) < /test/myCSV.csv
dec2ip(){
本地ip数据中心=$@
对于{3..0}中的e
做
((八位组=dec/(256**e)))
((dec-=八位字节*256**e))
ip+=$delim$octet
本地delim=。
完成
printf“%s\n”$ip
}
(
#打印未触及的标题
读取行;回显“$line”>>/test/myCSV\u new.csv
如果=,
当读取ra字段时,执行以下操作:
字段[3]=$(dec2ip“${fields[3]}”)
echo“${fields[*]}”>>/test/myCSV\u new.csv
完成
)
向我们显示您的输入(输入csv的几行)和预期输出(csv),而不是声明一个。您的需求可以用更简单的方法解决建议:1)2)3)4)将awk或perl/python与csv结合使用modules@Inian:输入文件是十进制格式的IP地址列表,加上标题(如上所示)。输出是同一个文件,其中第一行不应修改,其他行应使用函数“dec2ip”转换为点格式@mlama:我可以提醒您注意第一条注释的第一个字吗?@Cyrus:VLAN ID,名称,描述,子网11,txt1,txt223456 12,txt3,txt4789012 13,txt5,TXT6345678非常感谢你,格伦!我根据您的指示修改了我的脚本,但我仍然坚持使用它。我应该取消注释“#printf'%s\n'$ip”“,现在它可以工作了。再次感谢格伦,你的提示非常有用!
VLAN ID,NAME,DESCRIPTION,SUBNET
11,txt1,txt2,0.1.226.64
12,txt3,txt4,0.12.10.20
13,txt5,txt6,0.5.70.78
dec2ip () {
local ip dec=$@
   for e in {3..0}
      do
         ((octet = dec / (256 ** e) ))
         ((dec -= octet * 256 ** e))
         ip+=$delim$octet
         local delim=.
      done
printf '%s\n' "$ip"
}

(
    # print the header untouched
    read line; echo "$line" >> /test/myCSV_new.csv
    IFS=,
    while read -ra fields; do
       fields[3]=$(dec2ip "${fields[3]}")
       echo "${fields[*]}" >> /test/myCSV_new.csv
    done
) < /test/myCSV.csv