Linux多行合并成一行

之前碰到个问题,想把所有的文件作为一个列表参数输入给一个程序,于是想到了ls -1,它能够干净地一行行展示所有的文件,那么怎么将他们合并并以逗号分隔呢?这里介绍若干种方法都可以达成,并可以利用到文件内部多行的合并。参考链接

方法1:paste版本:ls -1 | paste -sd "," -

解读:这里最后的横杠告诉paste从STDIN读取数据,并不是所有的版本都需要这个参数。-s参数告诉paste把一个文件的所有行一次处理,不要并行处理;-d参数告诉paste分隔符是啥

方法2:awk版本:ls -1 | awk 'ORS=","' | head -c -1

解读:上述awk种的ORS是输出分隔符,直接把换行符变成逗号;head的-c参数是截取,-1表示除了最后一个字符,其他的全部输出。举一反三:ls -1 | awk 'ORS=", "' | head -c -2。在mac上可能不支持负向截取,解决方法就是安装coreutils(brew install coreutils),安装完之后用ghead命令即可。

方法3:sed版本

sed -e ':a; N; $!ba; s/\n/,/g'
# :a         # label called 'a'
# N          # append next line into Pattern Space (see info sed)
# $!ba       # if it's the last line ($) do not (!) jump to (b) label :a (a) - break loop
# s/\n/,/g   # any substitution you want

解读:线性版本,还有复杂度平方版本:

seq 1 100000 | sed ':a; N; $!ba; s/\n/,/g' | head -c 80
# linear, in less than 0.1s
seq 1 100000 | sed ':a; /$/N; s/\n/,/; ta' | head -c 80
# quadratic, hung

方法4:perl版本

ls -1 | perl -l40pe0
ls -1 | perl -pe 's/\n$/some_delimiter/'
ls | perl -F'\n' -0777 -anE 'say join ",", @F'
ls -1 | perl -E 'say join ", ", map {chomp; $_} <>'

perl不太懂,这里给个解释截图吧:

方法5:ls版本,如果分隔符是逗号,那么ls -m即可;如果分隔符想要空格,那么ls | xargs即可

方法6:tr版本:ls -1 | tr '\n' ',',tr直接将回车替换成逗号,后面还得加个head -c才能删除末尾逗号。

方法7:find版本

find . -type f -print0 | tr '\0' ','
find . -type f | paste -d, -s

方法8:其他版本:

(set -- *; IFS=,; echo "$*")
output=$(set -- *; IFS=,; echo "$*")
mystring=$(printf "%s|" *)
echo ${mystring%|}
ls | xargs -d, -L 1 echo
ls | xargs -I {} echo {}, | xargs echo
81 views

©2020 by EasyCSTech. Special thanks to IPinfo​ and EasyNote.