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

时间:2017-08-14 20:59:17

标签: 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"

使用Array:

 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        

2 个答案:

答案 0 :(得分:4)

在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

答案 1 :(得分:2)

perl -lnE'push @d, [split /\s*=\s*/] }{ 
    for $i (0..$#d) { say join ",", map $_->[$i], @d }
' input.txt

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

这就像构建和转置矩阵一样。

如果提供了更多数据,例如a = 1,10,100(或a = 1 10 100),则可以使用split /\s*[=,]\s*/(或使用/\s*[=\s]\s*/模式),其余代码不变。

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