किसी फ़ील्ड के मान के आधार पर डेटा का चयन करें


0

मेरे पास कई प्रविष्टियों वाली एक फाइल है जिसमें आईडी और दूसरी फाइल के साथ एक अन्य फाइल है जो एक TAB द्वारा अलग-अलग क्षेत्रों में उपविभाजित है। मुझे पहली फ़ाइल के मिलान मूल्य के आधार पर दूसरी फ़ाइल के रिकॉर्ड का चयन करने की आवश्यकता है। मैंने वेब पर देखा है कि AWK सही उपकरण है (हालांकि शायद GREP सरल है), लेकिन मुझे कोई आउटपुट नहीं मिलता है।

इस उदाहरण के लिए, मैंने फ़ाइलों की तुलना में सरणियों का उपयोग किया, लेकिन awk का उपयोग करने के लिए मुझे एक अस्थायी फ़ाइल बनानी पड़ी। संक्षेप में, मुझे पहली फ़ाइल (var1) द्वारा प्रदान किए गए मूल्य के साथ दूसरी फ़ाइल (var2) के तीसरे क्षेत्र से मेल खाना चाहिए। चयन फ़ॉर्म var2 होना चाहिए: "shameText \ t someWhat \ t beta \ t thatIs", जिसमें से मैं केवल पहला फ़ील्ड प्रिंट करता हूं, इसलिए आउटपुट बस होना चाहिए: "shameText"। मैं सरणियों को असाइन करने का सही तरीका याद कर सकता हूं, लेकिन वैसे भी यह उदाहरण फाइलों पर असली मैच के लिए एक प्रॉक्सी है।

सवाल यह है: किसी चर के दर्ज और मूल्य के बीच एक मैच के आधार पर एक पंक्ति (रिकॉर्ड) या एक एकल फ़ील्ड का चयन कैसे करें?

उदाहरण:

var1="alpha beta gamma delta epsilon"
var2="
'someText somethingElse zeta  someMore'
'sameText someElse  kappa andMore'
'shameText  someWhat  beta  thatIs'
'shortText  moreElse  theta andMore'"
echo $var2 > tempFile
for i in $var1
do
  printf "i is: %s\n" $i
  awk -F\t '$3 == "$i" {print $1}' tempFile
  echo "next item"
done
rm tempFile

अगर मैं सही समझ गया, तो आप उन पंक्तियों को खोजना चाहते हैं var2जिसमें तीसरा क्षेत्र var1सूची में शब्द में से एक है , तो उन पंक्तियों के केवल पहले क्षेत्र को प्रिंट करेंgrep -f <(tr ' ' '\n' <file-with-IDs) file-with-fields | cut -f1
पाउलो

(मुझे यह टिप्पणी पहले पोस्ट करनी चाहिए थी) आपका कोड काम करता है, लेकिन कुछ सुधार हैं। में echo $var2 > tempfile $ var2 होना चाहिए टैब और नई लाइनों को संरक्षित करने के डबल-कोटेड echo "$var2" > tempfile। Awk लाइन में, -F विकल्प को सेट करने की आवश्यकता नहीं होती है, डिफ़ॉल्ट awk सेपरेटर रिक्त और टैब होते हैं, और चर $iको शेल के संपर्क में होना चाहिए awk '$3 == "'$i'" {print $1}' tempFileध्यान दें कि awk कमांड के अंदर डबल-कोट्स हैं।
पाउलो

जवाबों:


0

अधिक सरल awkसमाधान $ 3 की तुलना रेगेक्स से की जा सकती है।

awk '$3 ~ /alpha|beta|gamma|delta|epsilon/ {print $1}' tempFile

सूची को पास करना $var1

awk '$3 ~ /'"${var1// /|}"'/ {print $1}' tempFile

यदि $ var1 एक फ़ाइल है, तो आप इसे बिल्ली के साथ जागने के लिए पास कर सकते हैं

awk '$3 ~ /'"$(cat IDs|tr ' ' '|')"'/ {print $1}' tempFile


धन्यवाद पाउलो, मैं हमेशा बैश के उद्धरणों के साथ भ्रमित हो जाता हूं। दूसरा उपाय जो आप मुझे देते हैं वह ठीक काम करता है। लेकिन आखिरकार, मुझे लगता है कि grep आसान है।
गिगीक्स

रिकॉर्ड के लिए, मेरे वास्तविक डेटा के साथ मुख्य समस्या यह थी कि मैंने उन्हें विंडोज़ से लिनक्स में निर्यात किया था। मुझे ऐसा करना था: gdp कमांड को काम करने के लिए r -d '\ r' <file_dos> file_linux।
गिगीक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.