根据文件B.csv第一列的条目从文件A.csv中删除行[重复]

ua4mk5z4  于 2023-02-17  发布在  其他
关注(0)|答案(3)|浏览(96)
    • 此问题在此处已有答案**:

awk the column of one file from another file(2个答案)
4天前关闭。
我从预处理管道中拿到了两份文件。

#fileA.csv
87687,"institute Polytechnic, Brazil"
342424,"university of India, India"
24343,"univefrsity columbia, Bogata, Colombia"
82739, "Hero univetsity, greece"
....
<3million lines>
#fileB.csv
342424
82739
...
<some 2 million entries>

我想从fileB.csv中过滤fileA.csv,如中所示,我想保留fileA.csv的第1列中与fileB.csv匹配的行(这些是ID)。换句话说,对于fileA.csv中的每一行,如果fileB.csv中不存在第一列条目,则删除该行。
我不太清楚如何在bash中进行(id更喜欢),而不是在python中编写(对于每一行,查看第一个条目是否在ID列表和过滤器中)。
在上面的简单示例中,输出将只是:

#result.csv
342424,"university of India, India"
82739, "Hero univetsity, greece"

在python中,id do(伪代码):

fileBlist=<load fileB.csv>
for item in fileAcsv:
   x=item[0]
   yesy_no=x in fileB_list
   <append entry>
  • 更新 *

我已经尝试了张贴的解决方案,但似乎有一些不一致(也许这是我的错!)。所以,:

fileB.csv has 29206428 lines
fileA.csv has 32128236 lines.

我希望看到结果文件包含29206428行,但结果文件是30932039行。这在逻辑上似乎是不可能的(in other words, for each in row in fileA.csv if the first column entry is not present in fileB.csv, delete the line.):d和我想知道是怎么回事。

q8l4jmvw

q8l4jmvw1#

您可以使用以下awk解决方案:

awk -F, 'FNR == NR { exists[$1]; next }
         $1 in exists' fileB.csv fileA.csv > result.csv

cat result.csv

342424,"university of India, India"
82739, "Hero univetsity, greece"
u59ebvdq

u59ebvdq2#

你可以对文件进行排序,然后使用join

sort -t, -k1,1 fileA.csv > fileA_sorted.csv
sort -t, -k1,1 fileB.csv > fileB_sorted.csv
join -t, -1 1 -2 1 fileA_sorted.csv fileB_sorted.csv > result.csv

这是使用相同的格式为文件,因为你上面分享。

zwghvu4y

zwghvu4y3#

使用awk
awk -F, 'NR==FNR{arr[$1];next} ($1 in arr)' fileB.csv fileA.csv | tee result.csv

文件大小只有大约15MB的一个'just' id s

printf '%s\n' {1..2000000} >> fileB
du -h fileB
15M fileB
输出
$ cat result.csv
342424,"university of India, India"
82739, "Hero univetsity, greece"

相关问题