合并两个具有不同长度和可能注解的列的文件到CSV文件中

e1xvtsh3  于 2023-04-27  发布在  其他
关注(0)|答案(4)|浏览(144)

file1看起来像

# dsd
# dsd
1,2,5
2,3,5
1,2,5
2,3,5
3,4,5
3,4,5

file2看起来像

# s
1,2
1,2

我想把它们合并

# dsd
# dsd
1,2,5,1,2
2,3,5,1,2
1,2,5,,
2,3,5,,
3,4,5,,
3,4,5,,

也就是说,我想保留第一个文件中的注解行#在注解行之后,我想粘贴第二个文件中的列,将它们填充到第一个文件的列长度。如果第二个文件中有任何注解行,忽略它们。
我开始说:

paste $(grep -v '^#' file1) file2

但我得到bash: /usr/bin/paste: Argument list too long
我猜这将是一个工作awk,但我只熟悉单文件处理,我只找到了处理相同长度的文件的例子。有没有一个简单的方法或需要去更长的bash脚本或python等。?

qrjkbowd

qrjkbowd1#

您可以使用此awk解决方案:

awk -v OFS=, '
NR == FNR {
   if (!/^#/)
      a[++i] = $0
   next
}
{
   if (/^#/)
      print
   else {
      ++NR2
      if (NR2 in a)
         print $0, a[NR2]
      else
         print $0,"",""
   }
}' file2 file1

# dsd
# dsd
1,2,5,1,2
2,3,5,1,2
1,2,5,,
2,3,5,,
3,4,5,,
3,4,5,,
bqjvbblv

bqjvbblv2#

使用任何awk:

$ cat tst.awk
BEGIN { FS=OFS="," }
FNR == 1 {
    lineNr = 0
    dflt = a[1]
    gsub("[^"FS"]+","",dflt)
}
/^#/ {
    if ( NR != FNR ) {
        print
    }
    next
}
{ ++lineNr }
NR == FNR {
    a[lineNr] = $0
    next
}
{ print $0, (lineNr in a ? a[lineNr] : dflt) }
$ awk -f tst.awk file2 file1
# dsd
# dsd
1,2,5,1,2
2,3,5,1,2
1,2,5,,
2,3,5,,
3,4,5,,
3,4,5,,
rxztt3cl

rxztt3cl3#

使用强大的Miller、paste、cat和grep,您可以运行

paste -d ',' <(grep -v '^#' file1.txt) <(grep -v '^#' file2.txt) | mlr --csv -N --ragged cat >output
<file1.txt grep -P '^#' | cat - output > tmp.txt && mv tmp.txt output

得到

# dsd
# dsd
1,2,5,1,2
2,3,5,1,2
1,2,5,,
2,3,5,,
3,4,5,,
3,4,5,,

步骤:

  • 水平合并两个输入文件,删除注解行(通过pastegrep);
  • 添加缺少的逗号(通过mlr);
  • 将第一个文件的注解行添加到合并的文件中(通过grepcat
yyyllmsg

yyyllmsg4#

下面是一个带有CSV模块的Ruby:

ruby -r csv -e '
f1=CSV.read(ARGV[0])
f2=CSV.read(ARGV[1]).select{|row| !row.join("")[/^\s*#/] }
f2=[""]*f1.slice_when{|a,b| b.to_s[/\d/]}.first.length+f2
f2c=f2.max_by{|row| row.length}.length
puts CSV.generate{|csv| 
    f1.zip(f2).each{|row| 
        if row.flatten.join("")[/^\s*#/] 
            csv<<row[0] 
        elsif row[-1].nil?
            csv<<row[0]+[nil]*f2c
        else 
            csv<<row.flatten
        end
    }
}
' file1 file2

这不限于file2仅为2列的假设。
它确实假设file1是两个文件中较长的一个。如果不是这样,很容易改变。
图纸:

# dsd
# dsd
1,2,5,1,2
2,3,5,1,2
1,2,5,,
2,3,5,,
3,4,5,,
3,4,5,,

相关问题