【问题标题】:How to extract lines with common fields如何提取具有公共字段的行
【发布时间】:2013-10-04 19:07:27
【问题描述】:

我有一个这样的文件 -

1 2 3
1 4 5
a z 3
a 3 4
a f g
b b g

我想将其拆分为多个文件(与组一样多),每个文件都包含具有相同第一个字段的行。

 1 2 3
 1 4 5

 a z 3
 a 3 4
 a f g

 b b g

我该怎么做?我试过uniq --all-repeated=separate -w 32,但在查找重复项时它会考虑完整的行,而不仅仅是第一列。

【问题讨论】:

  • 不会sort 为您分组吗?

标签: bash sed awk uniq


【解决方案1】:

类似这样的:

$ awk '{print > $1}' input

$ cat 1
1 2 3
1 4 5

$ cat a
a z 3
a 3 4
a f g

$ cat b
b b g

【讨论】:

  • 你要> 而不是>> awks 重定向操作符和shell 不一样。
  • 是的,文件句柄在脚本执行期间是打开的。更新
  • $1 是一行的第一个字段,$2 是第二个字段,依此类推。 print,好吧,打印指向以第一个字段命名的文件的整行。文件句柄在脚本执行期间是打开的,因此将附加行。
【解决方案2】:

更好的文件命名方法:

$ ls
file

$ awk '!($1 in a){a[$1]="file"++i}{print > a[$1]}' file

$ ls
file  file1  file2  file3

$ cat file1
1 2 3
1 4 5

$ cat file2
a z 3
a 3 4
a f g

$ cat file3
b b g

【讨论】:

    猜你喜欢
    • 2011-02-14
    • 2018-03-16
    • 2012-04-03
    • 2013-08-10
    • 2021-10-21
    • 1970-01-01
    • 2018-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多