我有一个文件csv
:
data1,data2,data2
data3,data4,data5
data6,data7,data8
我想将其转换为(包含在变量中):
variable
= data1,data2,data2%0D%0Adata3,data4,data5%0D%0Adata6,data7,data8
我的尝试:
data=''
cat csv | while read line
do
data="${data}%0D%0A${line}"
done
echo $data # Fails, since data remains empty (loop emulates a sub-shell and looses data)
请帮助..
答案 0 :(得分:10)
更简单地从文件中删除换行符:
tr '\n' '' < yourfile.txt > concatfile.txt
答案 1 :(得分:5)
在bash中,
data=$(
while read line
do
echo -n "%0D%0A${line}"
done < csv)
在非bash shell中,您可以使用`...`
代替$(...)
。此外,echo -n
,它会抑制换行符,但遗憾的是,它不是完全可移植的,但这又适用于bash。
答案 2 :(得分:4)
其中一些答案非常复杂。怎么样。
data="$(xargs printf ',%s' < csv | cut -b 2-)"
或
data="$(tr '\n' ',' < csv | cut -b 2-)"
太&#34;外部实用程序&#34;为你?
IFS=$'\n', read -d'\0' -a data < csv
现在你有一个阵列!无论你喜欢输出它,也许用
输出data="$(tr ' ' , <<<"${data[@]}")"
还是&#34;外部效用?&#34;好吧,
data="$(printf "${data[0]}" ; printf ',%s' "${data[@]:1:${#data}}")"
是的,printf
可以是内置的。如果它不是echo
而且支持-n
,请改为使用echo -n
:
data="$(echo -n "${data[0]}" ; for d in "${data[@]:1:${#data[@]}}" ; do echo -n ,"$d" ; done)"
好的,现在我承认我有点傻了。安德鲁的答案是完全正确的。
答案 3 :(得分:3)
我更喜欢循环:
for line in $(cat file.txt); do echo -n $line; done
注意:此解决方案要求输入文件在文件末尾有一个新行,否则它将删除最后一行。
答案 4 :(得分:2)
另一个短暂的bash解决方案
variable=$(
RS=""
while read line; do
printf "%s%s" "$RS" "$line"
RS='%0D%0A'
done < filename
)
答案 5 :(得分:1)
awk 'END { print r }
{ r = r ? r OFS $0 : $0 }
' OFS='%0D%0A' infile
使用 shell :
data=
while IFS= read -r; do
[ -n "$data" ] &&
data=$data%0D%0A$REPLY ||
data=$REPLY
done < infile
printf '%s\n' "$data"
最近的 bash 版本:
data=
while IFS= read -r; do
[[ -n $data ]] &&
data+=%0D%0A$REPLY ||
data=$REPLY
done < infile
printf '%s\n' "$data"
答案 6 :(得分:0)
无用的猫,受到惩罚!您想将CSV提供给循环
while read line; do
# ...
done < csv
答案 7 :(得分:0)
一个非常简单的单行解决方案,它不需要额外的文件,因为它很容易理解(我认为,只需将文件放在一起并执行sed-replace):
output=$(echo $(cat ./myFile.txt) | sed 's/ /%0D%0A/g')