首页 \ 问答 \ Unix - 并排打印公共线(Unix - Print Common Lines side by side)

Unix - 并排打印公共线(Unix - Print Common Lines side by side)

我想比较2个未分类的文件并排打印公共线

文件1

a 1 2
b 2 4
c 1 4
e 1 2

文件2
a 0 3
c 1 4
d 3 4
b 2 4

OUTPUT1

a 1 2 0 3
b 2 4 2 4
c 1 4 1 4

OUTPUT2
a 1 2 0 3
b 2 4 2 4
c 1 4 1 4
d 3 4
e 1 2

我可以实现使用Join但我想使用awk找到命令。

我们可以在不对文件进行排序的情况下使用awk来获取output1和output2吗?


I want to compare 2 unsorted files and print the common lines side by side

File1

a 1 2
b 2 4
c 1 4
e 1 2

File2
a 0 3
c 1 4
d 3 4
b 2 4

output1

a 1 2 0 3
b 2 4 2 4
c 1 4 1 4

output2
a 1 2 0 3
b 2 4 2 4
c 1 4 1 4
d 3 4
e 1 2

I can achieve using Join but i want to find a command using awk.

Can we do it without sorting the file and using awk to get the output1 and output2?


原文:https://stackoverflow.com/questions/37550909
更新时间:2022-01-26 09:01

最满意答案

$ awk '
    NR==FNR {line[$1]=$0; next} 
    $1 in line {
        f2fields = gensub($1 FS, "", 1)
        print line[$1], f2fields > "output1"
        print line[$1], f2fields > "output2"
        seen[$1]++
        next
    } 
    {print > "output2"} 
    END { for (key in line) if (!(key in seen)) print line[key] > "output2" }
' file1 file2

$ cat output1
a 1 2 0 3
c 1 4 1 4
b 2 4 2 4

$ cat output2
a 1 2 0 3
c 1 4 1 4
d 3 4
b 2 4 2 4
e 1 2

输出{1,2}文件的顺序由1)file2的记录的顺序,然后2)未出现在file2中的file1的记录“随机”输出(以散列顺序)确定。


$ awk '
    NR==FNR {line[$1]=$0; next} 
    $1 in line {
        f2fields = gensub($1 FS, "", 1)
        print line[$1], f2fields > "output1"
        print line[$1], f2fields > "output2"
        seen[$1]++
        next
    } 
    {print > "output2"} 
    END { for (key in line) if (!(key in seen)) print line[key] > "output2" }
' file1 file2

$ cat output1
a 1 2 0 3
c 1 4 1 4
b 2 4 2 4

$ cat output2
a 1 2 0 3
c 1 4 1 4
d 3 4
b 2 4 2 4
e 1 2

The order of the output{1,2} files is determined by 1) the order of the records of file2, then 2) the records of file1 not appearing in file2 are output "randomly" (in hash order).

相关问答

更多
  • 从man diff来看,你可以使用-y来做并行的。 -y, --side-by-side output in two columns 所以说: diff -y /tmp/test1 /tmp/test2 测试 $ cat a $ cat b hello hello my name my name is me is you 我们来比较一下: $ diff -y ...
  • 不要将完整图片生成为单个std::string ,您需要访问构成每个std::vector的各个std::string值。 这样,您可以运行单个循环,其中每个迭代输出填充到l.maxLen字符的下一个l字符串,然后输出下一个r字符串,然后输出换行符。 两张照片都已耗尽时结束循环。 例如: #include #include class Picture { private: std::vector picList; std::si ...
  • 你正在寻找的命令是comm 。 例如:- comm -12 1.sorted.txt 2.sorted.txt 这里: -1 :禁止列1(1.sorted.txt唯一的行) -2 :抑制第2列(2.sorted.txt唯一的行) The command you are seeking is comm. eg:- comm -12 1.sorted.txt 2.sorted.txt Here: -1 : suppress column 1 (lines unique to 1.sorted.txt) -2 ...
  • 根据http://wiki.bash-hackers.org/syntax/ccmd/conditional_expression,=〜是: =~ 将根据扩展正则表达式进行检查 - 匹配时为TRUE 所以^#是一个扩展的正则表达式。 因为#不是扩展正则表达式中的特殊字符。 if的含义检查$1中的字符串不以#开头。 所以在命令行上 $ if [[ ! '#' =~ ^# ]]; then echo matches; else echo no match; ...
  • 实现一个结合所有模型的TableModel类。 TableModel model = new ParallelTableModel(jTStudents.getModel(), jTScores.getModel(), TResults.getModel()); JTable totalTable = new JTable(model); ...
  • 由于N mod 4周期性地在[0;3]范围内变化: 1,2,3,0,1,2,3,0,1 1, 2, 3, 0, 1, 2, 3, 0, 1, ... ,因此可以测试模运算的结果是否为零,并且如果是,则打印换行符: i=0 while read line do printf '%s ' "$line" (( ++i % 4 )) || printf '\n' done < /tmp/moo.txt 在此示例中, printf使用附加空格( %s )打印文件中的下一行。 %s格式规范代表一个字符串(第 ...
  • 这很简单,例如,您可以在for循环中解压缩元组: myList =[('05', 5), ('08', 3), ('12', 5)] for a, b in myList: # <-- this unpacks the tuple like a, b = (0, 1) print(a, b) 输出: 05 5 08 3 12 5 It is rather simple, you can, for instance, unpack the tuple in a for loop: myList ...
  • 看看itertools.zip_longest 。 import itertools for a, b in itertools.zip_longest([1,2], [3,4,5]): print(a, b) # outputs 1 3 2 4 None 5 您可以更改用于填充kwarg fillvalue 。 Check out itertools.zip_longest. import itertools for a, b in itertools.zip_longest([1,2], ...
  • $ awk ' NR==FNR {line[$1]=$0; next} $1 in line { f2fields = gensub($1 FS, "", 1) print line[$1], f2fields > "output1" print line[$1], f2fields > "output2" seen[$1]++ next } {print > "output2"} ...
  • 您可以使用zip()函数将列表连接在一起。 a = ['a', 'b', 'c'] b = ['1', '0', '0'] res = "\n".join("{} {}".format(x, y) for x, y in zip(a, b)) zip()函数将使用每个列表中的相应元素迭代元组,然后您可以将其格式化为Michael Butscher在评论中建议的格式。 最后,只需join()它们与newlines一起join() ,就可以获得所需的字符串。 print(res) a 1 b 0 c 0 Y ...

相关文章

更多

最新问答

更多
  • 如何重新加载下拉列表(How to reload dropdownlist)
  • RStudio:在脚本中保留特殊字符(RStudio: keeping special characters in a script)
  • Powershell的“GetLatest”不会在新的TFS工作区上下载文件(“GetLatest” with Powershell doesn't download files on new TFS workspace)
  • 我如何让JS识别一个由字符组成的数组?(How do I get JS to recognise an array insted of characters?)
  • EF从存储过程中急切加载(EF eager loading from stored procedure)
  • 将输出文件添加到Python扩展(Adding output file to Python extension)
  • 淮北职业技术学院电脑应用专业咋样?
  • 更改默认扩展面板箭头的箭头样式(Change arrow style for default expansion panel arrow)
  • 芜湖计算机(计算机)培训机构(培训班,学校)哪家好
  • 致命错误:使用clang-llvm ASTMatcher时未找到'stddef.h'文件(fatal error: 'stddef.h' file not found when using clang-llvm ASTMatcher)
  • 内容的.NET缓存(Contentful .NET caching)
  • 客户端没有发生WCF回调(WCF callback is not happening in client)
  • 使用friend在全局范围内调用类成员函数会产生27个错误(Calling a Class member function in Global Scope using friend Gives 27 ERRORS)
  • 如何绑定到WPF中的另一个控件属性(How to Bind to Another Control Property in WPF)
  • 南华大学电脑专业,就业好不好
  • 是否存在泄密文件的官方(或常见)文件扩展名或后缀?(Is there an official (or common) file extention or suffix for deflated files?)
  • 在SVM python中只训练一次(Training only once in SVM python)
  • 淘汰自定义绑定光滑js无法正常工作(knockout custom binding for slick js not working)
  • 似乎无法正确地抓住网站“福布斯”(Can't seem to scrape the website “Forbes” properly)
  • 无法使用boto.rds2从describe_instance方法检索有关db实例的信息(Not able to retrieve information about db instances from the describe_instance method using boto.rds2)
  • 转换为英国日期格式问题(Convert to british date format issue)
  • 在表中列出不同的元组(10种方法)(List distinct tuples in a table(SQL query)(10 ways))
  • OrientDB查询比较(OrientDB query compare)
  • 全局变量有什么不好?(What is so bad about global variables? [duplicate])
  • 为什么JavaMail Transport.send()是一个静态方法?(Why is JavaMail Transport.send() a static method?)
  • 获取最近3个Instagram图像张贴在一个地方(Get last 3 instagram images posted in a place)
  • 使用libnfc格式化/读/写NDEF Mifare 1K卡(Format/Read/Write NDEF Mifare 1K Card using libnfc)
  • 阻止谷歌索引特定图像(Block Google from indexing a particular image)
  • 消息模板接收让Dispatcher没有订阅频道(Message Template receive gives Dispatcher has no subscribers for channel)
  • OpenShift:使用自定义节点版本(OpenShift: Use custom node version)