2017-06-09 3 views
5

में लाइन नंबर के आधार पर एक फ़ाइल से लाइनों उठाओ मैं दो फ़ाइलें - एक पते (लाइन नंबर) और अन्य एक डेटा, इस तरह शामिल हैं:अन्य फ़ाइल

पता फ़ाइल:

2 
4 
6 
7 
1 
3 
5 

डेटा फ़ाइल

1.000451451 
2.000589214 
3.117892278 
4.479511994 
5.484514874 
6.784499874 
7.021239396 

मैं पता फ़ाइलें की संख्या के आधार पर डेटा फ़ाइल randomize करना चाहते हैं तो मैं मिलता है:

2.000589214 
4.479511994 
6.784499874 
7.021239396 
1.000451451 
3.117892278 
5.484514874 

मैं इसे या तो पाइथन या बैश में करना चाहता हूं, लेकिन अभी तक कोई समाधान नहीं मिला है।

+0

क्या पता फ़ाइल में लाइन संख्या या डेटा फ़ाइल से 'int की संख्या' है? – heemayl

+0

केवल लाइन संख्या – hassan

+3

'मैं इसे या तो पाइथन या बैश में करना चाहता हूं' फिर कुछ कोशिश करें और प्रश्न में कोड जोड़ें ... – Sundeep

उत्तर

2
awk साथ

:

awk 'NR==FNR {a[NR]=$0; next} {print a[$0]}' data.txt addr.txt 
  • NR==FNR {a[NR]=$0; next} कुंजी रिकॉर्ड (लाइन) नंबर की जा रही है और मूल्यों पूरे रिकार्ड होने के साथ एक साहचर्य सरणी a बनाता है, यह केवल पहली फ़ाइल के लिए लागू किया जाएगा (NR==FNR), जो data.txt है।next रिकॉर्ड किसी भी आगे

  • {print a[$0]} प्रसंस्करण के बिना अगली पंक्ति में जाना awk बनाता कुंजी currect फ़ाइल के (addr.txt) लाइन (रिकार्ड) संख्या

उदाहरण होने के साथ सरणी से मूल्य प्रिंट :

% cat addr.txt 
2 
4 
6 
7 
1 
3 
5 

% cat data.txt 
1.000451451 
2.000589214 
3.117892278 
4.479511994 
5.484514874 
6.784499874 
7.021239396 

% awk 'NR==FNR {a[NR]=$0; next} {print a[$0]}' data.txt addr.txt 
2.000589214 
4.479511994 
6.784499874 
7.021239396 
1.000451451 
3.117892278 
5.484514874 
+2

अच्छा समाधान और महान स्पष्टीकरण। – codeforester

+0

अजीब में बहुत लचीला उपयोग। भविष्य में उपयोग के लिए स्पष्टीकरण के साथ – CWLiu

+0

अच्छी गुणवत्ता का जवाब। पीएस: मैंने DV नहीं किया था। –

0

तुम कर सकते हो, यह भी, Python भीतर, इस उदाहरण की तरह:

with open("address_file", 'r') as f1, open("data_file", "r") as f2: 
    data1 = f1.read().splitlines() 
    data2 = f2.read().splitlines() 

for k in data1: 
    # Handle exceptions if there is any 
    try: 
     print(data2[int(k)-1]) 
    except Exception: 
     pass 

संपादित करें: सुझाव @heemayl के रूप में, यहाँ का उपयोग कर एक और समाधान है केवल एक list:

with open("file1", 'r') as f1, open("file2", 'r') as f2: 
    data = f2.read().splitlines() 

    for k in f1.read().splitlines(): 
     print(data[int(k)-1]) 

दोनों इच्छा उत्पादन:

2.000589214 
4.479511994 
6.784499874 
7.021239396 
1.000451451 
3.117892278 
5.484514874 
+2

आपको दो सूचियों की आवश्यकता नहीं है। बस डेटा नंबर के लिए सूची बनाएं और फ़ाइल के लिए लाइनों के साथ लाइन संख्याओं के साथ पुनरावृत्त करें। – heemayl

+0

हाँ, मुझे पता है। लेकिन मुझे लगता है कि ओपी के कोड के अंदर क्या हो रहा है उसे पकड़ना आसान है। मुझे नहीं लगता कि उसके पास पाइथन का उपयोग करके अपने प्रश्न का उत्तर देने का अच्छा ज्ञान था। लेकिन फिर भी आपकी टिप्पणी सही है। –

3

ऐसा न करने पर दिमाग sed, हम इसे आसानी से प्राप्त करने के लिए process substitution का उपयोग कर सकते हैं:

sed -nf <(sed 's/$/p/' addr.txt) data.txt 
  • -n डिफ़ॉल्ट मुद्रण
  • -f बनाता sedaddr.txt

में प्रक्रिया प्रतिस्थापन <(...)

  • <(sed 's/$/p/' addr.txt) लाइन नंबर के आधार पर sed प्रिंट आदेश बनाता से आदेश को पढ़ने को दबा देता है उत्पादन :

    2.000589214 
    4.479511994 
    6.784499874 
    7.021239396 
    1.000451451 
    3.117892278 
    5.484514874 
    
  • संबंधित मुद्दे