【问题标题】:Consolidate two csv file to generate a third csv file with selected rows from both existing csv file合并两个 csv 文件以生成第三个 csv 文件,其中包含两个现有 csv 文件中的选定行
【发布时间】:2014-03-29 11:47:03
【问题描述】:

我编写了一个 shell 脚本来生成两个 csv fileA 和 fileB 文件。我需要在现有的 .ksh 文件中添加脚本,该脚本可以将 fileA 的第三列添加到将要生成的新 csv 文件的第 1 列,并将 fileB 的第二列添加到新 csv 的第二列.有什么办法吗? 例如。

fileA                      fileB 

A B C D                    1 2 3 4                

output.csv

C 2 

使用 awk 命令我可以读取如下列:

awk -F" " '{print $3}' fileA.csv

但对如何将输出输出到所需列感到困惑。

【问题讨论】:

标签: shell unix


【解决方案1】:

或者如果你喜欢 bash(或 ksh),像这样将 fileB 放在 3 号文件描述符上,然后从每个文件中读取一行:

#!/bin/ksh
while read -r a1 a2 a3 a4 && read -r b1 b2 b3 b4 <&3; do
   echo $a3 $b2 
done < fileA 3<fileB

【讨论】:

  • 我试过这个,但我收到以下错误:$ while read -r a1 a2 a3 a4 && read -r b1 b2 b3 b4 b5 echo $a4 $b4 > done
  • 您将&lt;&amp;3 输入错误为&lt;$3
  • 是的,谢谢...它工作但现在问题来了,就像我将输出重定向到这样的文件 $ while read -r a1 a2 a3 a4 && read -r b1 b2 b3 b4 b5 echo $a4 $b4 > 完成 output.csv 。结果被定向到文件,但下一个 echo 命令 echo "Do you want to update ?[Y/N]" 也会自动重定向到 output.csv 。为什么 ?以及关闭它的解决方案是什么。
  • 很难从评论中看出你在做什么。请编辑您的问题并显示您正在使用的代码以及哪些代码不起作用,以便我们提供帮助。
  • $ while read -r a1 a2 a3 a4 && read -r b1 b2 b3 b4 b5 echo $a4 $b4 > 完成 output.csv 。结果被定向到文件,但下一个回显命令 echo "Do you want to update ?[Y/N]" read Z if [ Z==Y];然后执行一些 sybase 查询,输入将来自 output.csv 文件,如 done > NewResult.csv
【解决方案2】:

cutpaste

paste -d" " <(cut -d" " -f3 fileA) <(cut -d" " -f2 fileB)

【讨论】:

    【解决方案3】:

    或者,如果你喜欢 bash 数组,你可以将 fileA 每一行的第三个字段读入数组 A[],将 fileB 每一行的第二个字段读入一个数组 B[],然后遍历并打印他们并排:

    #!/bin/bash
    A=($(awk '{print $3}' fileA))    # Read 3rd field of every line of fileA into array A
    B=($(awk '{print $2}' fileB))    # Read 2nd field of every line of fileB into array B
    
    for ((i=0;i<${#A[@]};i++))
    do
       echo "${A[$i]} ${B[$i]}"
    done
    

    【讨论】:

      【解决方案4】:

      你可以像这样用 awk 做到这一点:

      awk 'FNR==NR{x[FNR]=$3;next} {print x[FNR],$2}' fileA fileB
      

      说明

      FNR==NR 后面的花括号部分仅适用于 FileA 的处理。它将 FileA 的第三个字段保存在由行号 (FNR) 索引的数组 x[] 中。第二组花括号适用于 FileB 的处理。它打印从 FileA 保存的数组 x[] 的元素,然后是 FileB 的第二个字段。

      【讨论】:

        【解决方案5】:

        请不要为这个答案投票。

        bash(我认为是第 4 版)

        mapfile -t a < fileA
        mapfile -t b < fileB
        
        for (( i=0, i<${#a[@]}; i++ )); do
            lineA=( ${a[i]} )
            lineB=( ${b[i]} )
            echo "${lineA[2]} ${lineB[1]}"
        done
        

        红宝石

        ruby -e '
            a,b = ARGV.map {|f| File.readlines(f).map {|l| l.chomp.split}}
            a.each_index {|i| puts "#{a[i][2]} #{b[i][1]}"}
        ' fileA fileB
        

        Perl

        perl -lE '
            ($a,$b) = map {open my $f, "<", $_; [map {[split]} <$f>]} @ARGV;
            say "$a->[$_][2] $b->[$_][1]" for (0..@$a)
        ' fileA fileB
        

        【讨论】:

        • 好吧,你给我留下了深刻的印象,你可以停下来了! :-)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-13
        • 2012-08-12
        • 2017-09-14
        • 2017-09-06
        相关资源
        最近更新 更多