将命令粘贴到不同的行号文件

时间:2016-04-02 22:07:59

标签: linux bash awk

如果我有两个不同行号的文件,我只想输出相同的行并省略较大文件中的多余行。

我应该写什么粘贴命令?

我试过了:

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

但它不起作用。

2 个答案:

答案 0 :(得分:0)

paste的热门版本中没有此类选项;但在Awk中并不难做到。

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

FNR是当前文件中的行号,NR是输入文件中产生的行号。在处理第一个输入文件时,第一个条件为真;然后,我们打印成对,直到我们用完。

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

作为一种快速解决方法,如果这是一次性要求,您可以从两个文件开始,并使用另外一个输入文件等管道进入另一个调用,直到您处理完所有文件为止。

如果,如您的示例所示,您只想提取一些字段,可能会将$0 s(整个输入行)更改为$1(第一个字段)或任何合适的字段。< / p>

只是为了好玩,这是一个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()

答案 1 :(得分:0)

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

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

装饰/不装饰图案。添加行号,将1-1与行号合并,并在末尾删除它们。