如何连接Bash中的文件中的所有行?

时间:2011-11-04 17:06:43

标签: bash shell loops while-loop

我有一个文件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)

请帮助..

8 个答案:

答案 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')