[英]Map tab separated file with a list using awk/sed/join
我有多個帶有兩列的大文件(制表符分隔)。 這些文件的內容是這樣的:
工作文件-1
K00001 0.188
K00005 15.97
K00008 188.09
映射文件
K00001
K00002
K00003
K00004
K00005
K00006
K00007
K00008
映射文件范圍為 K00001 - K25804
我想將 map 我的 working_file-1 映射到映射文件,以便 output 看起來像這樣:
K00001 0.188
K00002
K00003
k00004
K00005 15.97
K00006
K00007
k00008 188.09
空白(工作文件中不存在 K0)可以用零填充(如果可能)或可以保留為空白。
到目前為止,我按照其他類似的帖子嘗試了這些代碼(但沒有成功):
awk 'NR==FNR {a[$1]++; next} $1 in a' mapping file working_file-1 > output.file
grep -Fw -f mapping file working_file-1 > output.file
編輯:od -c work1 的 output; od -c map
0000000 K 0 0 0 0 1 \r \n K 0 0 0 0 2 \r \n
0000020 K 0 0 0 0 3 \r \n K 0 0 0 0 4 \r \n
0000040 K 0 0 0 0 5 \r \n K 0 0 0 0 6 \r \n
0000060 K 0 0 0 0 7 \r \n K 0 0 0 0 8 \r \n
給定一個“地圖”文件,例如:
a
b
c
d
e
f
g
h
和一個“work1”文件,如:
a A
c C
g G
和所需的“merged1” output 像:
a A
b
c C
d
e
f
g G
h
然后join
可以進行組合:
join -1 1 -2 1 -a 1 -o 0,2.2 map work1 > merged1
-1 1 -2 1
加入每個文件的第一個(空格分隔)字段-a 1
打印第一個文件中的行,即使未配對-o 0,2.2
格式 output 作為連接字段(第一列),分隔符(空格),然后是第二個文件的第二個字段改為生成“merged2”,如:
a A
b 0
c C
d 0
e 0
f 0
g G
h 0
添加-e
選項:
join -1 1 -2 1 -a 1 -e 0 -o 0,2.2 map work1 > merged2
如果“work2”的字段由單個空格以外的字符分隔,請使用-t
選項。
例如,使用“work2”使用單個制表符分隔符,例如:
a A
c C
g G
(注意:stackoverflow 使用空格而不是單個選項卡顯示此內容)然后使用 POSIX shell,使用-t ' '
(即 QUOTE TAB QUOTE - 如果 shell 執行歷史完成,可能需要鍵入: ' CTRL-V TAB ' ):
join -t ' ' -1 1 -2 1 -a 1 -e 0 -o 0,2.2 map work2 >merged3
或使用 bash,可以使用-t $'\t'
代替:
join -t $'\t' -1 1 -2 1 -a 1 -e 0 -o 0,2.2 map work2 >merged3
產生“merged3”,如:
a A
b 0
c C
d 0
e 0
f 0
g G
h 0
(注意:stackoverflow 再次將選項卡顯示為空格)
對-s
使用 GNU sort
(穩定排序),這可能是您想要的:
$ sort -k1,1 -u -s working_file-1 mapping_file
K00001 0.188
K00002
K00003
K00004
K00005 15.97
K00006
K00007
K00008 188.09
或者如果你想添加0
s:
$ sort -k1,1 -u -s working_file-1 mapping_file |
awk -v OFS='\t' '{print $1, $2+=0}'
K00001 0.188
K00002 0
K00003 0
K00004 0
K00005 15.97
K00006 0
K00007 0
K00008 188.09
如果你沒有 GNU 排序,那么你可以這樣做:
$ sort -k1,1 -k2,2rn working_file-1 mapping_file |
awk -v OFS='\t' '$1 != p{print $1, $2+0; p=$1}'
K00001 0.188
K00002 0
K00003 0
K00004 0
K00005 15.97
K00006 0
K00007 0
K00008 188.09
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.