두 파일을 결합하고 공백을 모두 유지하고 싶습니다.

두 파일을 결합하고 공백을 모두 유지하고 싶습니다.

두 개의 데이터 파일을 결합하려고 합니다. 첫 번째 항목에는 100,000개의 레코드가 있으며 각 행은 사람을 나타냅니다. 두 번째 파일에는 400,000개의 기록이 있으며, 첫 번째 파일의 사람은 여러 번 나타날 수 있습니다. 두 파일의 첫 번째 열에는 각 사람의 고유 ID가 있습니다.

첫 번째 열로 파일을 결합하고 파일 1의 정보를 파일 2에 추가하고 싶습니다. 따라서 새 파일에는 datafile1의 모든 사람에 대한 추가 정보가 포함된 400,000개의 행이 있습니다.

저는 아주 간단한 방법을 사용하려고 합니다.

join data2 data1 > data3

그러나 data2의 열 3은 1, 2 또는 3개의 문자이고 어떤 열에도 정보가 없기 때문에 출력 파일이 내가 원하는 것과 같지 않습니다.

모든 열 사이의 공백을 유지하고 열을 정렬하고 싶습니다!

데이터 1:

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

관련 정보