Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有没有一种方法可以根据字段(比如说字段3)从两个文件(anb)中获取唯一的行,如果存在重复项,则a优先?_Python_Bash - Fatal编程技术网

Python 有没有一种方法可以根据字段(比如说字段3)从两个文件(anb)中获取唯一的行,如果存在重复项,则a优先?

Python 有没有一种方法可以根据字段(比如说字段3)从两个文件(anb)中获取唯一的行,如果存在重复项,则a优先?,python,bash,Python,Bash,我有两个文件A.txt和B.txt。我需要一个按字段2列出的唯一行列表,其中a.txt优先于B.txt cat A.txt: HHH,香蕉,3 HHH,苹果,2 JJJ,柠檬,100 cat B.txt: LLL,梨,4 CCC,苹果,9 TTT,柠檬,9 结果应该是: HHH,香蕉,3 HHH,苹果,2 JJJ,柠檬,100 LLL,梨,4 值lemon和apple在两个文件中重复,但A.txt优先 我试着在bash中使用gawk、sed和cut来实现它,但这看起来太混乱了。另外,我被告知这必

我有两个文件A.txt和B.txt。我需要一个按字段2列出的唯一行列表,其中a.txt优先于B.txt

cat A.txt:

HHH,香蕉,3
HHH,苹果,2
JJJ,柠檬,100

cat B.txt:

LLL,梨,4
CCC,苹果,9
TTT,柠檬,9

结果应该是:

HHH,香蕉,3
HHH,苹果,2
JJJ,柠檬,100
LLL,梨,4

值lemon和apple在两个文件中重复,但A.txt优先

我试着在bash中使用gawk、sed和cut来实现它,但这看起来太混乱了。另外,我被告知这必须是python

没有代码显示。请求帮助

结果应该是:

HHH,香蕉,3
HHH,苹果,2
JJJ,柠檬,100

LLL,pear,4

您可以使用以下
awk
命令:

awk -F, '!d[$2]++' A.txt B.txt
这将产生:

HHH,banana,3
HHH,apple,2
JJJ,lemon,100
LLL,pear,4
说明:

  • -F,
    告诉
    awk
    使用
    作为字段分隔符
  • d
    是一个数组,用于存储看到给定密钥的次数
  • $2
    指的是第二个字段,它是要用来唯一标识行的键
  • 对于脚本第一次看到的每个键,
    d[$2]
    将自动计算为
    0
  • 使用not运算符
    !0
    变为真值,
    awk
    将执行打印整行的默认操作
  • 使用紧跟在
    d[$2]
    之后的
    ++
    运算符,
    d[$2]
    的值将在计算其值后增加
    1
  • 因此,下次脚本看到具有相同键的行时,
    d[$2]
    将为非零,并且
    !d[$2]
    将导致一个假值,
    awk
    因此不会执行任何操作
  • a.txt
    列在
    b.txt
    之前,因此首先处理它,因此它的行优先于
    b.txt

您可以使用以下
awk
命令:

awk -F, '!d[$2]++' A.txt B.txt
这将产生:

HHH,banana,3
HHH,apple,2
JJJ,lemon,100
LLL,pear,4
说明:

  • -F,
    告诉
    awk
    使用
    作为字段分隔符
  • d
    是一个数组,用于存储看到给定密钥的次数
  • $2
    指的是第二个字段,它是要用来唯一标识行的键
  • 对于脚本第一次看到的每个键,
    d[$2]
    将自动计算为
    0
  • 使用not运算符
    !0
    变为真值,
    awk
    将执行打印整行的默认操作
  • 使用紧跟在
    d[$2]
    之后的
    ++
    运算符,
    d[$2]
    的值将在计算其值后增加
    1
  • 因此,下次脚本看到具有相同键的行时,
    d[$2]
    将为非零,并且
    !d[$2]
    将导致一个假值,
    awk
    因此不会执行任何操作
  • a.txt
    列在
    b.txt
    之前,因此首先处理它,因此它的行优先于
    b.txt

您需要读取这些文件,按endOfLine拆分,然后按“,”拆分。之后,您将得到一个二维列表。您循环浏览这两个列表(首先提供一个)。然后你在这些行中循环。检查所有C行的第二个元素是否与当前列表行的第二个元素相等。如果为true,则追加此行。然后我们将结果保存到文件C.txt中

def openFile(path):
    with open(path) as file:
        return file.read()
A=[i.split(',') for i in openFile('A.txt').split('\n')]
B=[i.split(',') for i in openFile('B.txt').split('\n')]
C=[]
for i in [A,B]:
    for y in i:
        if not any([y[1]==z[1] for z in C]):
            C.append(y)
with open('C.txt','w') as file:
    file.write('\n'.join([','.join(i) for i in C]))

您需要读取这些文件,按endOfLine拆分,然后按“,”拆分。之后,您将得到一个二维列表。您循环浏览这两个列表(首先提供一个)。然后你在这些行中循环。检查所有C行的第二个元素是否与当前列表行的第二个元素相等。如果为true,则追加此行。然后我们将结果保存到文件C.txt中

def openFile(path):
    with open(path) as file:
        return file.read()
A=[i.split(',') for i in openFile('A.txt').split('\n')]
B=[i.split(',') for i in openFile('B.txt').split('\n')]
C=[]
for i in [A,B]:
    for y in i:
        if not any([y[1]==z[1] for z in C]):
            C.append(y)
with open('C.txt','w') as file:
    file.write('\n'.join([','.join(i) for i in C]))

“无代码显示”通常是一个问题,因为本网站要求在您的问题中添加一个更好的语言,以更好地表达您知道多少,您尝试了什么,以及如何最好地帮助“无代码显示”通常是一个问题,因为本网站要求在您的问题中添加一个更好的语言,以更好地表达您知道多少,您尝试了什么,以及如何最好的帮助请解释一下这个魔法!很高兴能帮上忙。我已经用解释更新了我的答案。请解释一下这个魔法!很高兴能帮上忙。我已经用解释更新了我的答案。