অনন্য সনাক্তকারী সাথে দুটি ফাইল যোগদান


9

আমার আনুমানিক 12900 এবং 4400 এন্ট্রি সহ দুটি ফাইল রয়েছে যাতে আমি যোগ দিতে চাই। এই ফাইলগুলিতে বিশ্বের সমস্ত স্থলভাগের আবহাওয়া পর্যবেক্ষণ স্টেশনগুলির অবস্থান সম্পর্কিত তথ্য রয়েছে। বৃহত্তম ফাইলটি দ্বৈতভাবে আপডেট করা হয় এবং এক বছরে আরও ছোট হয়। মূল ফাইলগুলি এখানে পাওয়া যাবে ( http://www.wmo.int/pages/prog/www/ois/volume-a/vola-home.htm এবং http://weather.rap.ucar.edu/surface/ স্টেশন . txt )। আমার কাছে থাকা ফাইলগুলি ইতিমধ্যে আমার দ্বারা কিছু মিশ্র অ্যাডক, সেড এবং বাশ স্ক্রিপ্টের দ্বারা ম্যানিপুলেট করা হয়েছে। আমি জেমপ্যাক প্যাকেজটি ব্যবহার করে ডেটা ভিজ্যুয়ালাইজ করতে ফাইলগুলি ব্যবহার করি যা ইউনিডাটা থেকে নিখরচায় পাওয়া যায়। বৃহত্তম ফাইলটি জেমপ্যাকের সাথে কাজ করবে, তবে কেবল এটির সম্পূর্ণ ক্ষমতা দিয়ে নয়। এই জন্য একটি যোগদান প্রয়োজন।

ফাইল 1-এ আবহাওয়া পর্যবেক্ষণ স্টেশনগুলির অবস্থানের তথ্য রয়েছে, যেখানে প্রথম 6 ডিজিট অনন্য স্টেশন সনাক্তকারী। বিভিন্ন পরামিতি (স্টেশন নম্বর, স্টেশনের নাম, দেশের কোড, অক্ষাংশ দ্রাঘিমাংশ, এবং স্টেশন উচ্চতা) কেবলমাত্র লাইনে তার অবস্থান দ্বারা সংজ্ঞায়িত করা হয়, কোনও ট্যাব নেই।

         060090 AKRABERG FYR                        DN  6138   -666     101
         060100 VAGA FLOGHAVN                       DN  6205   -728      88
         060110 TORSHAVN                            DN  6201   -675      55
         060120 KIRKJA                              DN  6231   -631      55
         060130 KLAKSVIK HELIPORT                   DN  6221   -656      75
         060160 HORNS REV A                         DN  5550    786      21
         060170 HORNS REV B                         DN  5558    761      10
         060190 SILSTRUP                            DN  5691    863       0
         060210 HANSTHOLM                           DN  5711    858       0
         060220 TYRA OEST                           DN  5571    480      43
         060240 THISTED LUFTHAVN                    DN  5706    870       8
         060290 GROENLANDSHAVNEN                    DN  5703   1005       0
         060300 FLYVESTATION AALBORG                DN  5708    985      13
         060310 TYLSTRUP                            DN  5718    995       0
         060320 STENHOEJ                            DN  5736   1033      56
         060330 HIRTSHALS                           DN  5758    995       0
         060340 SINDAL FLYVEPLADS                   DN  5750   1021      28

ফাইল 2 এ ফাইল 1 এবং একটি দ্বিতীয়, 4 অক্ষর সনাক্তকারী (আইসিএও লোকেটার) এর অনন্য সনাক্তকারী রয়েছে।

060100 EKVG
060220 EKGF
060240 EKTS
060300 EKYT
060340 EKSN
060480 EKHS
060540 EKHO
060600 EKKA
060620 EKSV
060660 EKVJ
060700 EKAH
060780 EKAT

আমি দুটি ফাইলগুলিতে যোগ দিতে চাই, ফলস্বরূপ ফাইলে লাইনটির প্রথম 4 পজিশনে 4 অক্ষর সনাক্তকারী থাকবে, অর্থাত সনাক্তকারীকে 4 স্পেস প্রতিস্থাপন করা উচিত।

         060090 AKRABERG FYR                        DN  6138   -666     101
EKVG     060100 VAGA FLOGHAVN                       DN  6205   -728      88
         060110 TORSHAVN                            DN  6201   -675      55
         060120 KIRKJA                              DN  6231   -631      55
         060130 KLAKSVIK HELIPORT                   DN  6221   -656      75
         060160 HORNS REV A                         DN  5550    786      21
         060170 HORNS REV B                         DN  5558    761      10
         060190 SILSTRUP                            DN  5691    863       0
         060210 HANSTHOLM                           DN  5711    858       0
EKGF     060220 TYRA OEST                           DN  5571    480      43
EKTS     060240 THISTED LUFTHAVN                    DN  5706    870       8
         060290 GROENLANDSHAVNEN                    DN  5703   1005       0
EKYT     060300 FLYVESTATION AALBORG                DN  5708    985      13
         060310 TYLSTRUP                            DN  5718    995       0
         060320 STENHOEJ                            DN  5736   1033      56
         060330 HIRTSHALS                           DN  5758    995       0
EKSN     060340 SINDAL FLYVEPLADS                   DN  5750   1021      28

কিছু বাশ এবং / অথবা অ্যাডক স্ক্রিপ্ট দিয়ে এই কাজটি সম্পাদন করা সম্ভব?


ফাইলগুলি আইডি ক্ষেত্র অনুসারে বাছাই করা হয়?
चमत्कार 173

উত্তর:


8
awk 'BEGIN { while(getline < "file2" ) { codes[$1] = $2 } }
     { printf "%4s%s\n", codes[$1], substr($0, 5) }' file1

একটি মার্জিত সমাধান, যা আমি কেবল কয়েকটি প্রাথমিক দক্ষতা সহ বুঝতে পারি। ধন্যবাদ!
স্টাফান শেরলফ

প্রোগ্রামটি কাজ শুরু করার আগে একটি ফাইল মেমরিতে পড়ে। যদি ফাইলগুলি বড় হয়ে যায় যা পারফরম্যান্স উল্লেখযোগ্যভাবে হ্রাস করতে পারে। বড় ফাইলের জন্য এই পদ্ধতিটি ব্যবহার করা যাবে না।
चमत्कार 173

7

আমাদের মধ্যে কয়েকজন দেখতে চেয়েছিল যে আমরা joinকেবল এটি ব্যবহার করেই এই সমস্যাটি সমাধান করতে পারি । এটি করার জন্য এটি আমার প্রচেষ্টা। যেহেতু এটি আংশিকভাবে কাজ করে @ টেরডন আমার কাছে রাতের খাবার 8-)।

আদেশ

$ join -a1 -1 1 -2 1 -o 2.2 1.1 1.2 1.3 1.4 1.5 1.6 1.7 -e "N/A" \
     <(sort file1) <(sort file2)

উদাহরণ

$ join -a1 -1 1 -2 1 -o 2.2 1.1 1.2 1.3 1.4 1.5 1.6 1.7 -e "N/A" <(sort file1) <(sort file2) | column -t
N/A   060090  AKRABERG          FYR         DN    6138  -666  101
EKVG  060100  VAGA              FLOGHAVN    DN    6205  -728  88
N/A   060110  TORSHAVN          DN          6201  -675  55    N/A
N/A   060120  KIRKJA            DN          6231  -631  55    N/A
N/A   060130  KLAKSVIK          HELIPORT    DN    6221  -656  75
N/A   060160  HORNS             REV         A     DN    5550  786
N/A   060170  HORNS             REV         B     DN    5558  761
N/A   060190  SILSTRUP          DN          5691  863   0     N/A
N/A   060210  HANSTHOLM         DN          5711  858   0     N/A
EKGF  060220  TYRA              OEST        DN    5571  480   43
EKTS  060240  THISTED           LUFTHAVN    DN    5706  870   8
N/A   060290  GROENLANDSHAVNEN  DN          5703  1005  0     N/A
EKYT  060300  FLYVESTATION      AALBORG     DN    5708  985   13
N/A   060310  TYLSTRUP          DN          5718  995   0     N/A
N/A   060320  STENHOEJ          DN          5736  1033  56    N/A
N/A   060330  HIRTSHALS         DN          5758  995   0     N/A
EKSN  060340  SINDAL            FLYVEPLADS  DN    5750  1021  28

বিস্তারিত

joinউপরেরটি উপলব্ধ প্রতিটি বিকল্পের ব্যবহার করে যা আমার অন্ত্রকে বলে যে আমরা একে অন্যায়ভাবে ব্যবহার করেছি, যেমন ফ্র্যাঙ্কেনস্টাইন কিছু প্রকারের মতো, তবে আমরা সবাই এখানে শিখছি, তাই ঠিক আছে ... আমার ধারণা।

স্যুইচটি -a1এমন কোনও লাইন অন্তর্ভুক্ত করতে যোগদানের কথা বলছে যা ফাইল 1-তে ফাইল 2 এর সাথে মিল নেই। সুতরাং এটি প্রদর্শিত হচ্ছে এই লাইন ড্রাইভ:

N/A   060330  HIRTSHALS         DN          5758  995   0     N/A

-1 1এবং -2 1বলছে কলাম প্রধানত তাদের 1 ম কলাম, 2 ফাইল থেকে লাইন যোগদানের জন্য পারে। -o ...বলছে যা 2 ফাইল থেকে কলাম প্রদর্শন এবং যা অনুক্রমে করতে।

-e "N/A"STRING "এন / এ" একটি জায়গা ধারক মান হিসাবে ব্যবহার করার জন্য ক্ষেত্র খালি বলিয়া গণ্য জন্য প্রিন্ট করার জন্য বলেছেন join

সর্বশেষ 2 টি আর্গুমেন্ট 2 টি ফাইল খাওয়ানো হচ্ছে, file1এবং file2যোগদানের কমান্ডে সাজানো হয়েছে।

দয়া করে দয়া করুন, যেহেতু এটি একটি কাজ চলছে এবং আমরা joinকমান্ডটি ব্যবহার করে কেউ এই ধরণের সমস্যা কীভাবে সমাধান করতে পারে তা প্রদর্শনের চেষ্টা করছি , যেহেতু এটি এটিকে বোঝানো সমস্যার ধরণ বলে মনে হয়।

অসামান্য বিষয়

  1. 3 য় কলাম

    প্রধানটি হ'ল কীভাবে তৃতীয় কলামের সাথে লড়াই করতে হবে কারণ এটি 1 শব্দ এবং 2 শব্দের মানের মিশ্রণ। এটি দেখে মনে হচ্ছে এটি কোনও বড় হোঁচট খাচ্ছে joinএবং এর চারপাশের কোনও উপায় আমি বের করতে পারি না। কোন গাইডেন্স প্রশংসা করা হবে।

  2. ব্যবধান

    সমস্ত আসল ব্যবধান এর সাথে হারিয়ে গেছে joinএবং এটিকে প্রায় রাখার উপায় আমি দেখতে পাচ্ছি না। সুতরাং joinসব পরে সমস্যার এই ধরনের সঙ্গে মোকাবিলা করার জন্য সঠিক ভাবে নাও হতে পারে।

  3. কাজ মনে হচ্ছে?

    অনেক কমান্ড লাইন দিয়ে নমন পর সাধারণ সমাধান নেই তাই এই মত এটা অন্তত আংশিকভাবে কাজ করতে পারেন বলে মনে হচ্ছে না এই একটি সমাধান মূলে ব্যবহার করা যেতে পারে তাই হয়, এবং তারপর যেমন অন্যান্য সরঞ্জাম ব্যবহার করতে awkএবং sedএটা পরিষ্কার পর্যন্ত । যদিও এই প্রশ্নটি উত্থাপন করে: "আপনি যদি এটি কোনও উপায়ে awkএবং sedকোনও উপায়ে পরিষ্কার করছেন তবে আপনি কেবল সেগুলি সরাসরি ব্যবহার করতে পারেন?"।


@ টারডন - এই উত্তরটি দেখুন, আপনি কী ভাবছেন তা আমাকে জানান।
slm

+1 আমি মনে করি এটি সেই ইউনিক্স সরঞ্জাম যা এই জাতীয় কোনও কার্য সমাধানের জন্য প্রোগ্রাম করা হয়েছিল
चमत्कार 173

কেন না -e "N / A" এর পরিবর্তে ""। এটি কি কাজ করে না (আমি এটি চেষ্টা করতে পারি না)?
चमत्कार 173

@ चमत्कार 173 - সর্বত্র, হ্যাঁ একটি স্থান হিসাবে একটি আর্গ হিসাবে ব্যবহার। খুব কাজ করে। আমি এন / এ'র পক্ষে নির্বাচন করেছি যাতে এটি স্পষ্ট হয় যে এটি কী করছে।
slm

2
@ ইটারডন - হ্যাঁ এটি মজাদার সমস্যা ছিল না কম, একসাথে এতে কাজ করা উপভোগ করেছেন, আশা করি আমরা ভবিষ্যতের কিছু সমস্যাও একসাথে কাজ করতে পারি। আমি এখনও মনে করি যে এই উত্তরটি সাইটে কার্যকর উদ্দেশ্য হিসাবে কাজ করবে যেহেতু joinএখনকার ইন্টারনেটের একটি খুব চরম উদাহরণ আমি খুঁজে পাইনি । 8-)
slm

4

এটি ব্যবহার করে সম্ভব হওয়া উচিতjoin তবে আমি কীভাবে এটি ফাঁকা জায়গা এবং খালি ক্ষেত্রগুলি সঠিকভাবে প্রিন্ট করব তা আমি বুঝতে পারি না। যাইহোক, এই ছোট্ট পার্ল স্ক্রিপ্টটি কৌশলটি করবে:

#!/usr/bin/env perl

## Open file2, the one that contains the codes
## it is expected to be the 1st argument given to the script.
open($a,"$ARGV[0]"); 

## Read the number<=>code pairs into a hash (an associative array)
## called 'k'
while (<$a>) {
    chomp; @f=split(/\s+/); $k{$f[0]}=$f[1];
}

## Open file1, the one that contains the data
## it is expected to be the 2nd argument given to the script.
open($b,"$ARGV[1]"); 
## Go through the file
while (<$b>) {
    ## Split each line at white space into the array @f
    @f=split(/\s+/);  

    ## $f[1] is the 6 digit number that defines the different stations.
    ## If this number has an entry in the hash %k, if it was found
    ## in file2, replace the first 4 spaces with its value from the hash.
    s/^\s{4}/$k{$f[1]}/ if defined($k{$f[1]});

    ## Print each line of the file
    print; 
}

এটি সংরক্ষণ করুন foo.plএবং নিম্নলিখিত হিসাবে চালান:

$ perl foo.pl file2 file1
         060090 AKRABERG FYR                        DN  6138   -666     101
EKVG     060100 VAGA FLOGHAVN                       DN  6205   -728      88
         060110 TORSHAVN                            DN  6201   -675      55
         060120 KIRKJA                              DN  6231   -631      55
         060130 KLAKSVIK HELIPORT                   DN  6221   -656      75
         060160 HORNS REV A                         DN  5550    786      21
         060170 HORNS REV B                         DN  5558    761      10
         060190 SILSTRUP                            DN  5691    863       0
         060210 HANSTHOLM                           DN  5711    858       0
EKGF     060220 TYRA OEST                           DN  5571    480      43
EKTS     060240 THISTED LUFTHAVN                    DN  5706    870       8
         060290 GROENLANDSHAVNEN                    DN  5703   1005       0
EKYT     060300 FLYVESTATION AALBORG                DN  5708    985      13
         060310 TYLSTRUP                            DN  5718    995       0
         060320 STENHOEJ                            DN  5736   1033      56
         060330 HIRTSHALS                           DN  5758    995       0
EKSN     060340 SINDAL FLYVEPLADS                   DN  5750   1021      28

এটি দুর্দান্ত কাজ করে। অনেক ধন্যবাদ - আমি কোডটিতে আপনার ব্যাখ্যা পাঠ্যকে সত্যই প্রশংসা করি।
স্টাফান শেরলফ

@ স্টাফানসার্চলফ আপনাকে স্বাগতম। যদি এটি আপনার প্রশ্নের উত্তর দেয় তবে দয়া করে এটি স্বীকৃত হিসাবে চিহ্নিত করুন যাতে প্রশ্নের উত্তর হিসাবে চিহ্নিত করা যায়।
টেরডন

দ্বিতীয় চিন্তা নিয়ে স্টাফানসার্চলফ, অ্যাডাব্লিকটি গ্রহণ করুন, এটি আরও ভাল। - টেরডন 5 মিনিট আগে
টেরডন

@ ইটারডন - আপনি কি আর এটিতে যোগদানের সাথে ঝামেলা করলেন? যাওয়ার পথে দেখে মনে -oহয়েছিল, এর বৈশিষ্ট্যটি আগে কখনও ব্যবহার করিনি, আমি প্রত্যাশার মতো কাজ করিনি।
slm

@slm না, আমি কিছু সমন্বয় চিন্তা ছিল -oএবং -eকিন্তু এটা যে সব লাইন file2 কোন এন্ট্রি ছিল প্রিন্ট করতে পাই নি। ভাগ্য ভাল, আমি এটি সম্ভব কিনা তা জানতে আগ্রহী।
টেরডন

3

বাশ করবে।

#!/usr/bin/env bash

# ### create a psuedo hash of icao locator id's
# read each line into an array
while read -a line; do
  # set icao_nnnnnn variable to the value
  declare "icao_${line[0]}"=${line[1]}
done <file2


# ### match up icao id's from file1
# read in file line at a time
while IFS=$'\n' read line; do
  # split the line into array
  read -a arr <<< "$line"
  # if the icao_nnnnnn variable exists, it will print out
  var="icao_${arr[0]}"
  printf "%-8s %s\n" "${!var}" "$line"
done <file1

"হ্যাশ" বাশ 4 এর সাথে কী চলছে সে সম্পর্কিত বিশদটির জন্য এই এসও উত্তরটি দেখুন , সহসাইটিভ অ্যারেটির স্থানীয়ভাবে সমর্থন করে তবে এটি 3 + 4 (সম্ভবত 2?) এ কাজ করা উচিত

আপনার ফর্ম্যাটিংটি পেতে আপনার ফাইল 1 থেকে রেখাটি বামে ট্রিম করতে হতে পারে।


2

join(+ আরও কয়েকটি সরঞ্জাম) দিয়ে এটি করার এবং স্পেসিং সংরক্ষণের জন্য এখানে একটি সহজ উপায় । দুটি ফাইলই স্টেশন নম্বর অনুসারে বাছাই করা মনে হচ্ছে তাই কোনও অতিরিক্ত বাছাইয়ের প্রয়োজন নেই:

join -j1 -a1 -o 2.2 -e "    " file1 file2 | paste -d' ' - <(cut -c6- file1)

পাইপের আগের অংশটি তার উত্তরে কী পরিমাণ স্ল্যাম ব্যবহৃত হয়েছিল তার সাথে খুব মিল তাই আমি আর এটির উপরে যাব না। শুধু পার্থক্য যে আমি ব্যবহার করছি হয় -e " "পরিবর্তে একটি চার শূণ্যস্থান স্ট্রিং ইনপুট ক্ষেত্রে নিখোঁজ এবং - -o 2.2আউটপুট শুধুমাত্র file2 এর 2nd মাঠে
তাই join -j1 -a1 -o 2.2 -e " " file1 file2উত্পাদন চার গৃহস্থালির কাজ ব্যাপী কলাম (নীচের দৃশ্যমান নয় কিন্তু ইকে পর কিছু নেই ** এবং খালি লাইনগুলি আসলে চারটি স্থান):

EKVG







EKGF
EKTS

EKYT



EKSN

তারপরে আমরা ফাইলটি 1 তে pasteএটি (একটি সীমানা হিসাবে স্থান ব্যবহার করে) যা থেকে আমরা cutপ্রথম 5 টি অক্ষর | paste -d' ' - <(cut -c6- file1)
সমাপ্তি ফলাফল:

         060090 AKRABERG FYR                        DN  6138   -666     101
EKVG     060100 VAGA FLOGHAVN                       DN  6205   -728      88
         060110 TORSHAVN                            DN  6201   -675      55
         060120 KIRKJA                              DN  6231   -631      55
         060130 KLAKSVIK HELIPORT                   DN  6221   -656      75
         060160 HORNS REV A                         DN  5550    786      21
         060170 HORNS REV B                         DN  5558    761      10
         060190 SILSTRUP                            DN  5691    863       0
         060210 HANSTHOLM                           DN  5711    858       0
EKGF     060220 TYRA OEST                           DN  5571    480      43
EKTS     060240 THISTED LUFTHAVN                    DN  5706    870       8
         060290 GROENLANDSHAVNEN                    DN  5703   1005       0
EKYT     060300 FLYVESTATION AALBORG                DN  5708    985      13
         060310 TYLSTRUP                            DN  5718    995       0
         060320 STENHOEJ                            DN  5736   1033      56
         060330 HIRTSHALS                           DN  5758    995       0
EKSN     060340 SINDAL FLYVEPLADS                   DN  5750   1021      28
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.