2016-04-02 58 views
-1

如果我有两个不同行号的文件,我只想输出相同的行并省略大文件中的多余行。将命令粘贴到不同的行号文件上

我应该写什么粘贴命令?

我想:

paste -d: file1 file2|awk -F ':' '{print $1,$7}' 

但没有奏效。

+1

编辑您的Q与2个文件的小样本和您所需的输出。在突出显示的文本上使用编辑框左上方的格式工具将其格式化为代码/数据/输出。好运。 – shellter

回答

0

在热门版本paste中没有这样的选项;但在Awk中并不难。

awk 'NR==FNR { a[NR]=$0; next } 
    ! (FNR in a) { exit 0 } 
    { print a[FNR] ":" $0 }' file1 file2 

FNR是当前文件中的行号,和NR是在输入文件累积的行号。当第一个输入文件正在处理时,第一个条件将成立;然后,我们会打印对,直到我们用完。

如果你只需要两个文件,这个简单的版本就足够了;推广到三个或更多将需要相当重要的重构,因为问题更复杂。

作为一个快速的解决办法,如果这是一个一次性的要求,你可以用两个文件和管道开始与一个多输入文件,等另一个调用,直到处理完所有的文件。

如果如您的示例所示,只需要提取一些字段,也许可以将$0(整个输入行)更改为$1(第一个字段)或任何适合的字段。

只是为了好玩,这里是一个Python实现,它不需要将第一个文件的行读入内存,并且可以处理任意数量的输入文件(可能受操作系统允许的打开文件数量限制)。选项解析和错误检查留作练习。

from sys import argv 

h = [] 
for filename in argv[1:]: 
    h.append(open(filename, 'Ur')) 
while True: 
    line = [] 
    try: 
     for handle in h: 
      result = handle.readline() 
     if result == '': 
      raise StopIteration 
     line.append(result.rstrip('\n')) 
    print(':'.join(line)) 
    except StopIteration: 
     break 
for handle in h: 
    handle.close() 
0

替代awk的解决方案,特别是如果你不编辑的字段

$ join <(cat -n file1) <(cat -n file2) | cut -d' ' -f2- 

装饰/去除装饰图案。添加行号,将1-1与行号合并,并在最后剥离它们。