我把这个shell脚本放在一起做两件事:
它有效,但我想要一个更好的方法来做到这一点。我特别想找到一种将每一行爆炸成数组的替代方法。使用命令行参数似乎不太合适。任何评论都欢迎。
# Takes :: separated file as 1st parameters
SOURCE=$1
# create csv target file
TARGET=${SOURCE/dat/csv}
touch $TARGET
echo #userId,itemId > $TARGET
IFS=","
while read LINE
do
# Replaces all matches of :: with a ,
CSV_LINE=${LINE//::/,}
set -- $CSV_LINE
echo "$1,$2" >> $TARGET
done < $SOURCE
答案 0 :(得分:2)
您可以使用数组代替set
:
arr=($CSV_LINE)
echo "${arr[0]},${arr[1]}"
答案 1 :(得分:2)
以下内容将打印infile.dat
中的第1列和第2列。用。。。来代替
您想要的编号列的逗号分隔列表。
awk 'BEGIN { IFS='::'; OFS=","; } { print $1, $2 }' infile.dat > infile.csv
答案 2 :(得分:1)
Perl可能只有1个衬垫。
Awk也可能很容易做到。
我的第一反应是awk和sed的组合:
cat inputfile | sed -e 's/::/,/g' | awk -F, '{print $1, $2}'
# Or to avoid a UUOC award (and prolong the life of your keyboard by 3 characters
sed -e 's/::/,/g' inputfile | awk -F, '{print $1, $2}'
答案 3 :(得分:1)
awk
确实是这里工作的正确工具,它是一个简单的单行。
$ cat test.in
a::b::c
d::e::f
g::h::i
$ awk -F:: -v OFS=, '{$1=$1;print;print $2,$3 >> "altfile"}' test.in
a,b,c
d,e,f
g,h,i
$ cat altfile
b,c
e,f
h,i
$