Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.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_Shell_Awk - Fatal编程技术网

如何使用bash脚本将列数据转换为行数据并创建csv文件

如何使用bash脚本将列数据转换为行数据并创建csv文件,bash,shell,awk,Bash,Shell,Awk,在文本文件中有一些数据(输入数据),我想在CSV文件中转换。如何在bash脚本中创建以下格式 输入数据 a=1 b=2 c=3 d=4 输出数据(CSV文件数据) a、 b、c、d 1,2,3,4 无阵列 i=0 while IFS='=' read -r key value do echo "$key" echo "$value" echo "$i" i=$((i+1)) done < "stats.txt" i=0 而IFS='='

在文本文件中有一些数据(输入数据),我想在CSV文件中转换。如何在bash脚本中创建以下格式

  • 输入数据

    • a=1
    • b=2
    • c=3
    • d=4
  • 输出数据(CSV文件数据)

    • a、 b、c、d
    • 1,2,3,4

无阵列

i=0
 while IFS='=' read -r key value
 do
    echo "$key"
    echo "$value"
    echo "$i"
    i=$((i+1))
 done < "stats.txt"
i=0
而IFS='='读取-r键值
做
回显“$key”
回显“$value”
回音“$i”
i=$((i+1))
完成<“stats.txt”
使用阵列:

 i=0
 j=0
 while IFS='=' read -r key value
 do 
 echo arrayKey[`$i`]="$key"
 echo arrayVal[`$j`]="$value"
 i=`$((i+1))`
 j=`$((j+1))`
 done < status.txt        
i=0
j=0
而IFS='='读取-r键值
做
echo arrayKey[`i`]=“$key”
echo arrayVal[`$j`]=“$value”
i=`$((i+1))`
j=`$((j+1))`
完成

行被处理成数组
@d
,其中包含字段
([a,1],[b,2]…)
。之后,在由
}{
开始的结束块中,对于所有(两个)索引,使用
map
提取每个arrayref中相同索引处的元素,并与
连接

这就像构建和转换矩阵

如果给出了更多的数据,如
a=1,10100
(或
a=11000
),则可以使用
split/\s*[=,]\s*/
(或使用
/\s*[=\s]\s*/
模式),其余代码保持不变

在没有显式循环的情况下,我无法找到提取所有相同索引切片(“列”)的方法。

在awk中:

$ awk '                                  # awk it is
BEGIN { FS="=";OFS=",";start=1 }         # separators
NR>=start && $0!="" {                    # define start line and remove empties
    # sub(/\r/,"",$NF)                   # uncomment to remove windows line endings
    for(i=1;i<=NF;i++)                   # all cols 
        a[i]=a[i] (NR==start?"":OFS) $i  # gather
    }
END {                                    # in the end
    for(j=1;j<i;j++)                     # all ..
        print a[j]                       # outputed
}' file
a,b,c,d
1,2,3,4
$awk'#是啊
BEGIN{FS=“=”OFS=“,”start=1}分隔符
NR>=start&&$0!=''{#定义起始行并删除空的
#sub(/\r/,“”,$NF)#取消注释以删除windows行结尾

对于(i=1;我想你试过了吗?如果它应该是一个bash脚本,那么perl标记在这个问题上做了什么?你在这个网站上提出的所有问题都被否决了。我建议你做一个测试,学习更好的问题。Anubhava,我有一些代码,比如下面一个i=0 j=0,而IFS='='read-r键值do echo arrayKey[0][$i]=“$key”echo arrayVal[1][$j]=“$value”i=$((i+1))j=$((j+1))已完成将其编辑到您的问题中,我们将重新注释。这是如何支持不良行为的?(我认为是-1)你为什么不投票提前结束,就像我一直做的那样,这样我们就不会有问题了。++@JamesBrown谢谢你的支持。我没有认真对待这个问题(它只是要求代码,这就是为什么答案不友好的原因)。我只是不理解投票结果。我对我发布的内容唯一的不满是,我没有成功地将所有切片都进行循环。如何从文件中删除或跳过第一列更改var
start
的值。当我试图在生产中执行相同的代码时。数据没有得到转换。你能建议一下吗。这真的很难说仅基于该错误描述。请更具体。如果生产中的数据不同,请发布。描述环境和awk版本等。相同的脚本,相同的数据,相同的文件名,但在生产it 3.1.7和本地4.1.4上有两个不同的环境。是否有任何主要的差异b/w 2版本。我无法更新服务器,因为它使用了我的多个应用程序激动。
$ awk '                                  # awk it is
BEGIN { FS="=";OFS=",";start=1 }         # separators
NR>=start && $0!="" {                    # define start line and remove empties
    # sub(/\r/,"",$NF)                   # uncomment to remove windows line endings
    for(i=1;i<=NF;i++)                   # all cols 
        a[i]=a[i] (NR==start?"":OFS) $i  # gather
    }
END {                                    # in the end
    for(j=1;j<i;j++)                     # all ..
        print a[j]                       # outputed
}' file
a,b,c,d
1,2,3,4