伟大而知识渊博的 stackoverflow大师
我正试图为我的数据处理算法找到一个合适的编码解决方案,但我被卡住了。我有两个文件(文件1和文件2),有4列,格式如下:
0.23961 216185 518 LIRRTSI
0.156348 216185 338 NTGSPYE
0.0999144 216185 216 PLLTKLK
0.0749358 216185 162 STHIPSH
0.0624465 216185 135 MRQRRNR
0.0531952 216185 115 TQLPNIR
0.0518075 216185 112 SQQILNR
我想在file2第4列的字符串中搜索file1中包含匹配第4列字符串的行。然后,我想将每个文件的匹配的第4列字符串和关联行的第1列字符串输出到一个新文件中。例如:
文件1:
0.23961 216185 518 LIRRTSI
0.156348 216185 338 NTGSPYE
0.0999144 216185 216 PLLTKLK
文件2:
0.3333333 300000 1000 MRQRRNR
0.2000000 300000 600 LIRRTSI
0.0450000 300000 135 TQLPNIR
理想情况下,我的file3输出如下:
0.23961 LIRRTSI 0.2000000
或
0.23961 216185 518 LIRRTSI 0.2000000 300000 600 LIRRTSI
最重要的是,至少要将匹配的字符串和column1值输出到一个新文件中。我还通过bashcomm
生成了一个列4字符串的列表,这些字符串在文件1和文件2之间很常见。也许这是一个好的起点?关于如何在bash或python中实现这一点的任何想法。如果有解决方案,我也愿意尝试任何语言。
谦虚地说,
J。M.
您可以使用join
join -j4 -o 1.1 1.4 2.1 <(sort -k4 file1) <(sort -k4 file2)
-j4
:
连接第4列上的两个文件-o 1.1 1.4 2.1
:
输出第一列、文件1的第四列和文件2的第一列
python解决方案:
f1 = {}
for line in open('file1'):
f1[ line.split()[3] ] = line.strip()
for line in open('file2'):
other = f1.get(line.split()[3], None)
if other is not None:
print '%s %s' % (other, line.strip())
在你的两个文件上运行,这会产生:
0.23961 216185 518 LIRRTSI 0.2000000 300000 600 LIRRTSI
以上内容从file1开始,创建一个名为f1
的字典,该字典的关键字是列4的值。作为字典中一个条目的示例:f1['NTGSPYE'] = '0.156348 216185 338 NTGSPYE'
接下来,它一行一行地遍历file2,查找列4与字典f1
中的关键字匹配的任何行。如果匹配,则打印两个文件中相应的行。
请注意,文件中的数据用空格分隔。所以,对于其中一个文件的任何line
,line.split()
都是四个值的列表。因为python从零开始计数,所以第四列在line.split()[3]
中。
更多:将上述内容直接翻译为bash(v4或更好):
declare -A f1
while read -r one two three four
do
f1["$four"]="$one"
done <file1
while read -r one two three four
do
[ "${f1[$four]}" ] && echo "${f1[$four]} $four $one"
done <file2
使用awk
1) 输出格式:0.23961 LIRRTSI 0.2000000
awk 'FNR==NR{a[$4]=$1;next}$4 in a {print $1, $4, a[$4]}' file2 file1
2) 输出格式:0.23961216185518LIRRTSI0.2000000300000 600 LIRRTSI
awk 'FNR==NR{a[$4]=$0;next}$4 in a {print $0,a[$4]}' file2 file1
添加加入命令:
join -j4 -o 1.1 1.2 1.3 1.4 2.1 2.2 2.3 2.4 <(sort -k4 file1) <(sort -k4 file2)
0.23961 216185 518 LIRRTSI 0.2000000 300000 600 LIRRTSI