Linux:如何提取某些ID的行并且ID写在另一个文件中?

Linux:如何提取某些ID的行并且ID写在另一个文件中?

我有一个包含 ID 的 csv 文件。

1
3
8

我还有另一个信息文件,不仅包含 ID,还包含其他信息。如果我只想提取ID信息,该怎么做?

1 96 283 4
2 87 918 6
2 49 208 5
3 57 294 0
3 24 284 0
4 28 345 290
5 23 234 209
6 98 245 02
7 18 329 89
8 19 239 78
8 18 289 90
9 28 390 09
9 19 238 09
10 23 899 7

我想要制作这个文件

1 96 283 4
3 57 294 0
3 24 284 0
8 19 239 78
8 18 289 90

答案1

我会用awk

awk 'NR==FNR{a[$0]++;next}a[$1]' file1 file2

其中您的 ID 位于 file1 中,其余 ID 位于 file2 中。输出:

1 96 283 4
3 57 294 0
3 24 284 0
8 19 239 78
8 18 289 90

答案2

如果文件以空格分隔并且具有 Unix 风格的行结尾:

cat file1.txt | xargs -I '{}' -n 1  grep '^{} ' file2.txt

答案3

使用磨坊主你可以这样做

mlr --implicit-csv-header --headerless-csv-output --ifs " " --csv join -j 1 -r 1 -f joinInputOne.csv joinInputTwo.csv

获得

1,96,283,4 3,57,294,0 3,24,284,0 8,19,239,78 8,18,289,90

joinInputOne.csv 是

1 3 8

joinInputTwo.csv 是

1 96 283 4 2 87 918 6 2 49 208 5 3 57 294 0 3 24 284 0 4 28 345 290 5 23 234 209 6 98 245 02 7 18 329 89 8 19 239 78 8 18 289 90 9 28 390 09 9 19 238 09 10 23 899 7

答案4

如果您可以同质化每个文件中的第一个字段(例如通过添加前导“0”),则可以使用 join(1):

f1:

01
03
08

f2:

01 96 283 4
02 87 918 6
02 49 208 5
03 57 294 0
03 24 284 0
04 28 345 290
05 23 234 209
06 98 245 02
07 18 329 89
08 19 239 78
08 18 289 90
09 28 390 09
09 19 238 09
10 23 899 7

然后:

$ join f f2
01 96 283 4
03 57 294 0
03 24 284 0
08 19 239 78
08 18 289 90

相关内容