簡體   English   中英

Map 使用 awk/sed/join 的列表分隔文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM