我想加入两个文件并保留所有空白

我想加入两个文件并保留所有空白

我正在尝试加入两个数据文件。第一个有 100.000 条记录,每行代表一个人。第二个文件有 400.000 条记录,其中第一个文件中的某个人可以出现多次。两个文件中的第一列都有每个人的唯一 ID

我想按第一列加入文件,并将信息从文件 1 添加到文件 2...因此新文件将有 400.000 行,其中添加了有关 datafile1 中每个人的信息。

我尝试使用一个非常简单的方法:

join data2 data1 > data3

但是因为 data2 中的第 3 列要么是 1、2 要么 3 个字母,并且所有列中都没有信息,所以输出文件看起来不像我想要的样子。

我想保留所有列之间的空白,并且我希望列对齐!

数据一:

200616550010284  1655001  10072006  20012015  07102008  29012010  09012011  28122011
200616550010285  1655001  16082006  10052010  29092008  04092009                    
200616550010289  1655001  07092006  28052013  20072009  12072010  14072011  11102012
200616550010291  1655001  31102006  28032011  14012009  12012010                    
200616550010292  1655001  09112006  09092013  05012009  17012010  02022011  01032012
200616550010293  1655001  13122006  03092009  19022009  

                        

数据2:

200616550010284 22032010  32
200616550010284 10032011 162
200616550010285 04122008  32
200616550010285 18112009  32
200616550010289 02032008  32

我想要的数据:

200616550010284 22032010  32  1655001  10072006  20012015  07102008  29012010  09012011  28122011
200616550010284 10032011 162  1655001  10072006  20012015  07102008  29012010  09012011  2812201
200616550010285 04122008  32  1655001  16082006  10052010  29092008  04092009 
200616550010285 18112009  32  1655001  16082006  10052010  29092008  04092009 
200616550010289 02032008  32  1655001  07092006  28052013  20072009  12072010  14072011  11102012

使用简单连接时得到的数据:

200116380810352 06042008 60 1638081 30082001 29082014 19112005 22112006 08122007 21012009
200116380810599 09052008 31 1638081 30102001 24032013 30112004 04082006 25012008 19022009
200116380810599 27102008 76 1638081 30102001 24032013 30112004 04082006 25012008 19022009
200116386910204 02072008 162 1638691 05062001 15122009 12122005 11012007 18122007 10042009
200116386910204 20052008 60 1638691 05062001 15122009 12122005 11012007 18122007 10042009
200116386910204 26042008 60 1638691 05062001 15122009 12122005 11012007 18122007 10042009

答案1

怎么样

$ awk 'NR==FNR{a[$1] = substr($0,length($1)+1); next} $1 in a {print $0 a[$1]}' Data1 Data2
200616550010284 22032010  32  1655001  10072006  20012015  07102008  29012010  09012011  28122011

200616550010284 10032011 162  1655001  10072006  20012015  07102008  29012010  09012011  28122011

200616550010285 04122008  32  1655001  16082006  10052010  29092008  04092009

200616550010285 18112009  32  1655001  16082006  10052010  29092008  04092009

200616550010289 02032008  32  1655001  07092006  28052013  20072009  12072010  14072011  11102012

答案2

join仅支持分隔列,不支持固定大小的列。支持空白序列作为列分隔符,但它不记得每列后面有多少空白(无论如何,这仅适用于左对齐列)。

您可以在调用后重建列join。由于输出中的列由单个空格分隔,因此您可以将空格转换为制表符,然后调用expand以将列与您想要的位置对齐。但是,这将导致列左对齐。

为了处理右对齐的列,您可以预处理输入文件以使用不同的字符作为列分隔符和列内的对齐字符。例如,假设您的数据不包含#

join <(<data2 sed 'y/ /#/; s/\([^#]\)#/ #/g' | sort) \
     <(<data1 sed 'y/ /#/; s/\([^#]\)#/ #/g' | sort) |
  tr '#' ' '

答案3

我建议安装制表,这对于以列格式获取数据并将其显示为漂亮的表格通常很有用。然后你可以像这样一起使用它join

$ join data2 data1 | tabulate --format plain
200616550010284  22032010   32  1655001  10072006  20012015  07102008  29012010  09012011  28122011
200616550010284  10032011  162  1655001  10072006  20012015  07102008  29012010  09012011  28122011
200616550010285  04122008   32  1655001  16082006  10052010  29092008  04092009
200616550010285  18112009   32  1655001  16082006  10052010  29092008  04092009
200616550010289  02032008   32  1655001  07092006  28052013  20072009  12072010  14072011  11102012

相关内容