我的FileA
内容是:
LetterA LetterM 12
LetterB LetterC 45
LetterB LetterG 23
FileB
内容为:
LetterA 23 43 LetterZ
LetterB 21 71 LetterC
如果是,我想写FileA
来自$2-$3
的原始FileB
条目和条目FileA $1 = FileB $1 && FileA $2 = FileB $4
LetterB LetterC 45 -50
。
对于这样的输出:
while read ENTRY
do
COLUMN1=$(cut -f 1 $ENTRY)
COLUMN2=$(cut -f 2 $ENTRY)
awk -v COLUMN1="$COLUMN1" -v COLUMN2="COLUMN2" -v ENTRY="$ENTRY"
'($1==COLUMN1 && $4==COLUMN2)
{print ENTRY,$2-$3}' FileB
done < FileA
我可以使用bash循环
{{1}}
然而,这个循环太慢了。有没有办法在没有循环的情况下使用awk执行此操作? 要获取多个输入文件 - &gt;匹配他们的内容 - &gt;打印想要的输出。
答案 0 :(得分:3)
它可以用awk单行解决:
awk 'NR==FNR{a[$1":"$2]=$0; next}
NR>FNR && $1":"$4 in a{print a[$1":"$4], $2-$3}' fileA fileB
或者更简洁(感谢@JS웃):
awk 'NR==FNR{a[$1$2]=$0;next}$1$4 in a{print a[$1$4],$2-$3}' file{A,B}
答案 1 :(得分:1)
我决定尝试使用Python和Numpy来获得一个稍微不正统但有希望的快速解决方案:
import numpy as np
# load the files into arrays with automatically determined types per column
a = np.genfromtxt("fileA", dtype=None)
b = np.genfromtxt("fileB", dtype=None)
# concatenate the string columns (n.b. assumes no "foo" "bar" and "fo" "obar")
aText = np.core.defchararray.add(a['f0'], a['f1'])
bText = np.core.defchararray.add(b['f0'], b['f3'])
# find the locations where the strings from A match in B, and print the values
for index in np.where(np.in1d(aText, bText)):
aRow = a[index][0]
bRow = b[bText == aText[index]][0]
print '{1} {2} {3} {0}'.format(bRow[1] - bRow[2], *aRow)
编辑:一旦它开始它就会很快,但不幸的是,加载文件的时间比@ anubhava使用awk的优秀解决方案要长。