从文件中读取行并将它们以逗号分隔的字符串保存到变量中

时间:2013-04-21 20:57:26

标签: bash variables cat

我想从文本文件中读取行并将它们保存在变量中。

  cat ${1} | while read name; do

  namelist=${name_list},${name}

  done

文件如下所示:

David

Kevin

Steve
etc.

我希望得到这个输出

大卫,凯文,史蒂夫等。

并将其保存到变量$ {name_list}

4 个答案:

答案 0 :(得分:2)

name_list=""
for name in `cat file.txt`
   do VAR="$name_list,$i"
done

编辑:此脚本在name_list的开头留下“,”。有很多方法可以解决这个问题。例如,在bash中这应该有效:

name_list=""
for name in `cat file.txt`; do
   if [[ -z $name_list ]]; then
      name_list="$i"
   else
      name_list="$name_list,$i"
   fi  
done

重新编辑:感谢Fredrik的合理投诉:

name_list=""
while read name
do 
  if [[ -z $name_list ]]; then
      name_list="$name"
   else
      name_list="$name_list,$name"
   fi
done < file.txt

答案 1 :(得分:2)

命令:

$ tr -s '\n ' ',' < sourcefile.txt             # Replace newlines and spaces with [,]

这可能会返回,作为最后一个字符(可能是第一个字符)。 剃掉逗号并返回令人满意的结果:

$ name_list=$(tr -s '\n ' ',' < sourcefile.txt)      # store the previous result
$ name_list=${tmp%,}                                 # shave off the last comma
$ name_list=${tmp#,}                                 # shave off any first comma



修改

此解决方案运行速度提高44%,并在所有Unix平台上产生一致且有效的结果。

# This solution
python -mtimeit -s 'import subprocess' "subprocess.call('tmp=$(tr -s "\n " "," < input.txt);echo ${tmp%,} >/dev/null',shell = True)"
100 loops, best of 3: 3.71 msec per loop

# Highest voted:
python -mtimeit -s 'import subprocess' "subprocess.call('column input.txt | sed "s/\t/,/g" >/dev/null',shell = True)"
100 loops, best of 3: 6.69 msec per loop

答案 2 :(得分:1)

使用columnsed

namelist=$(column input | sed 's/\t/,/g')

答案 3 :(得分:0)

variable=`perl -lne 'next if(/^\s*$/);if($a){$a.=",$_"}else{$a=$_};END{print $a}' your_file`