![두 파일을 결합하고 공백을 모두 유지하고 싶습니다.](https://linux55.com/image/190700/%EB%91%90%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%EA%B2%B0%ED%95%A9%ED%95%98%EA%B3%A0%20%EA%B3%B5%EB%B0%B1%EC%9D%84%20%EB%AA%A8%EB%91%90%20%EC%9C%A0%EC%A7%80%ED%95%98%EA%B3%A0%20%EC%8B%B6%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
두 개의 데이터 파일을 결합하려고 합니다. 첫 번째 항목에는 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