在CSV文件中包含要转换的文本文件(输入数据)中的一些数据。如何在bash脚本中以下面的格式创建?
输入数据
输出数据(CSV文件数据)
没有数组
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
答案 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*/
模式),其余代码不变。
在没有显式循环的情况下,我找不到提取所有相同索引切片(“列”)的方法。