如果我有两个不同行号的文件,我只想输出相同的行并省略较大文件中的多余行。
我应该写什么粘贴命令?
我试过了:
paste -d: file1 file2|awk -F ':' '{print $1,$7}'
但它不起作用。
答案 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与行号合并,并在末尾删除它们。