在shell中将Row转换为Column

时间:2014-09-22 09:17:33

标签: linux bash shell

我需要在多个文件中转换以下内容。文本不必相同,但格式和长度相同

文件1:

XXXxx81511
XXX is Present
abcdefg
07/09/2014
YES
1
XXX
XXX-XXXX

文件2:

XXXxx81511
XXX is Present
abcdefg
07/09/2014
YES
1
XXX
XXX-XXXX

XXXxx81511,XXX is Present,abcdefg,07/09/2014,YES,1,XXXXXX-XXXX

XXXxx81511,XXX is Present,abcdefg,07/09/2014,YES,1,XXXXXX-XXXX

基本上将行转换为列并附加到新文件,同时添加逗号以分隔它们。

我正在尝试cat filename | tr' \ n' ','但结果确实在同一行中添加。像这样

XXXxx81511,XXX现在,abcdefg,07/09/2014,YES,1,XXXXXX-XXXX,XXXxx81511,XXX现在,abcdefg,07/09/2014,YES,1,XXXXXX-XXXX

4 个答案:

答案 0 :(得分:4)

使用:

paste -sd, file1 file2 .... fileN
#e.g.
paste -sd, *.txt file*

打印

XXXxx81511,XXX is Present,abcdefg,07/09/2014,YES,1,XXX,XXX-XXXX
XXXxx81511,XXX is Present,abcdefg,07/09/2014,YES,1,XXX,XXX-XXXX

如果你需要每一个之后的空行

paste -sd, file* | sed G

打印

XXXxx81511,XXX is Present,abcdefg,07/09/2014,YES,1,XXX,XXX-XXXX

XXXxx81511,XXX is Present,abcdefg,07/09/2014,YES,1,XXX,XXX-XXXX

短perl变体:

perl -pe 'eof||s|$/|,|' files....

答案 1 :(得分:1)

您需要在echo之后插入tr。使用这样的脚本:

for f in file1 file2; do
    tr '\n' ',' < "$f"; echo
done > files.output

答案 2 :(得分:0)

使用for循环:

for f in file*; do sed ':a;N;$!ba;s/\n/,/g' < $f; done

sed代码取自sed: How can I replace a newline (\n)?tr '\n' ','对我的有限测试设置无效。

答案 3 :(得分:0)

perl -ne 'chomp; print $_ . (($. % 8) ? "," : "\n")' f*

其中:

  • -n逐行读取文件但不打印每行
  • -e执行命令行中的代码
  • 8每个文件中的行数
  • f* glob for files(替换为将选择全部的内容) 你的文件)。如果您需要特定订单,您可能需要 这里更复杂的东西。