将unix输出发送到csv文件

时间:2014-12-09 20:24:33

标签: bash unix

我想将unix命令的输出数据放到csv文件中。 假设我得到的输出是:

A
B
C

我想将此数据作为

放在.csv文件中
A B C

在三个不同的列中,但同一行。

5 个答案:

答案 0 :(得分:4)

试试这个:

printf '%s\n' A B C | paste -sd ' ' >> file.csv

或更经典的CSV(带,的分隔符:

printf '%s\n' A B C | paste -sd ',' >> file.csv

printf '%s\n' A B C只是提供与您相同的样本输入的示例。我的解决方案也适用于同一行中的空格。

您的评论中的

编辑,您似乎需要使用for循环,因此:

for i in {0..5}; do printf '%s\n' {A..C} | paste -sd " " >> file.csv; done

或伪代码:

for ...:
    unix_command | paste -sd " " >> file.csv
endfor

答案 1 :(得分:3)

unix_command | tr "\n" " " > file.csv

unix_command | awk 'ORS=FS' > file.csv

答案 2 :(得分:1)

据我了解,@ Django需要三行一行。

paste -d ' ' - - - < infile

如果您需要输出为csv格式(由,分割),您可以使用此

paste -d ',' - - - < infile

这是测试结果

$ cat infile
Manoj Mishra
Japan
Environment.
Michael Jackson
America
Environment.

$ paste -d ',' - - - < infile

Manoj Mishra,Japan,Environment.
Michael Jackson,America,Environment.

答案 3 :(得分:0)

更一般的答案

如果您的命令输出是多行的,并且您想要输入 以csv格式引用输出,每行n个项目,以下脚本 可能很方便。


groupby程序从stdin

读取
  1. 引用每个输入行
  2. 使用逗号作为分隔符,在csv记录中引用n引用的输入行
  3. 可选地,使用-s可选参数,程序丢弃 如果所说的最后一行不完全包含n,则输出的最后一行 项目

    像往常一样,-h选项会回显使用行并退出。

    指定程序打印使用行并退出的另一个选项 错误。

    代码

    % cat groupby
    #!/bin/sh
    usage () { echo Usage: $0 [-s] n --- -s is for \"strict\", outputs only records of n items. ; exit $1 ; }
    s=0
    while getopts :sh o ; do
        case "${o}" in
            s) s=1 ; shift ;;
            h) usage 0     ;;
            *) usage 1     ;;
        esac
    done
    awk -v n=$1 -v s=$s -v q='"' '
    NR==1   {buf = q $0 q ; next}
    NR%n==1 {print buf; buf = q $0 q ; next}
            {buf = buf "," q $0 q}
    END     {if(!s||NR%n==0)print buf}'
    %
    

    使用示例

    % chmod +x groupby
    % echo -e "1\n2\n3\n4\n5" | ./groupby 3
    "1","2","3"
    "4","5"
    % echo -e "1\n2\n3\n4\n5\n6" | ./groupby 3
    "1","2","3"
    "4","5","6"
    echo -e "1\n2\n3\n4\n5\n6\n7" | ./groupby 3
    "1","2","3"
    "4","5","6"
    "7"
    % echo -e "1\n2\n3\n4\n5\n6\n7\n8" | ./groupby -s 4
    "1","2","3","4"
    "5","6","7","8"
    % echo -e "1\n2\n3\n4\n5\n6\n7" | ./groupby -s 4
    "1","2","3","4"
    %
    

    不同的角度

    我更改了默认设置以满足最佳OP要求,并引入了其他选项,请参阅用法字符串了解详情

    #!/bin/sh
    usage () { echo 'Usage: '$0' [-s] [-q quote_char] [-c separator_char] n
      Reads lines from stdin and prints them grouped by n and separated by spaces.
      Optional arguments:
        -s is for "strict", outputs only records of n items;
        -q quote_char, forces quoting of each input line;
        -c separator_char, changes the field separator,
           interesting alternatives are tab, comma, semicolon etc;
        -h prints this help and exits.' ; exit $1 ; }
    
    # Default options
    s=0 ; q='' ; c=' '
    
    # Treatment of optional arguments
    while getopts :shc:q: o ; do
        case "${o}" in
            s) s=1 ;         ;;
            c) c="${OPTARG}" ;;
            q) q="${OPTARG}" ;;
            h) usage 0       ;;
            *) usage 1       ;;
        esac
    done
    shift $(($OPTIND-1))
    
    # awk code
    awk -v n=$1 -v s=$s -v q="$q"  -v c="$c" '
        NR==1   {buf = q $0 q ; next}
        NR%n==1 {print buf; buf = q $0 q ; next}
                {buf = buf c q $0 q}
        END     {if(!s||NR%n==0)print buf}'
    

答案 4 :(得分:-2)

只需使用xargs

例如:

less filename| xargs >> filename.csv