2つのデータファイルを結合しようとしています。最初の項目には100,000レコードがあり、各行は人を表します。 2番目のファイルには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