2013-08-09 5 views
5

मेरे पास txt फ़ाइलें हैं, जिनमें से सभी एक ही निर्देशिका में हैं। प्रत्येक में डेटा के 2 कॉलम होते हैं। वे इस तरह दिखेगा:कॉलम के आधार पर एकाधिक txt फ़ाइलों में कैसे शामिल हों?

Label1 DataA1
Label2 DataA2
Label3 DataA3

मैं इस तरह के एक बड़ी फाइल बनाने के लिए शामिल होने का उपयोग करना चाहते हैं।

Label1 DataA1 DataB1 DataC1
Label2 DataA2 DataB2 DataC2
Label3 DataA3 DataB3 DataC3

वर्तमान में, मैं

fileA fileB शामिल होने | शामिल हों - फ़ाइलसी

हालांकि, मेरे पास उन सभी को सूचीबद्ध करने के लिए व्यावहारिक बनाने के लिए बहुत सारी फ़ाइलें हैं - क्या इस तरह के आदेश के लिए लूप लिखने का कोई तरीका है?

उत्तर

-1

बस एक फ़ोल्डर में सभी फ़ाइलें रख दिया और कर

join * | join - /someotherdir/fileC 
+0

यह केवल लौटा कमांड – Justin

+0

में शामिल होने के लिए उपयोग दिशानिर्देश काम नहीं करते हैं। 'शामिल हों:' '' के बाद लापता ऑपरेंड –

0

यह स्क्रिप्ट एकाधिक फ़ाइलों को एक साथ जुड़ (फ़ाइलें file* हैं)।

#!/bin/bash 
# Create two temp files 
tmp=$(mktemp) 
tmp2=$(mktemp) 
# for all the files 
for file in file* 
do 
    # if the tmp file is not empty 
    if [ -s "$tmp" ] 
    then 
     # then join the tmp file with the current file 
     join "$tmp" "$file" > "$tmp2" 
    else 
     # the first time $tmp is empty, so we just copy the file 
     cp "$file" "$tmp2" 
    fi 
    cp "$tmp2" "$tmp" 
done 

cat "$tmp" 

मैं मानता हूं कि यह बदसूरत है, लेकिन ऐसा लगता है।

2
awk साथ

आप इस तरह यह कर सकता है:

awk 'NF > 0 { a[$1] = a[$1] " " $2 } END { for (i in a) { print i a[i]; } }' file* 

आप अपनी फ़ाइलों को सॉर्ट करने के लिए करना चाहते हैं:

find -type f -maxdepth 1 -name 'file*' -print0 | sort -z | xargs -0 awk 'NF > 0 { a[$1] = a[$1] " " $2 } END { for (i in a) { print i a[i]; } }' 
कभी कभी के लिए

(मैं एक में) कुंजी आदेश है कि में नहीं भरता है वे जोड़े गए थे ताकि आप इसे सॉर्ट भी कर सकें लेकिन यह केवल गॉक में उपलब्ध है। ऑर्डर के लिए अनुक्रमित सरणी में मैपिंग कुंजियों का विचार केवल तभी संभव है जब कॉलम 1 में अंतर न हो।

gawk 'NF > 0 { a[$1] = a[$1] " " $2 } END { count = asorti(a, b); for (i = 1; i <= count; ++i) { j = b[i]; print j a[j]; } }' ... 
4

बैश के साथ आप एक स्क्रिप्ट है कि में शामिल होने के लिए एक पुनरावर्ती पाइप कार्यकारी करता है बना सकते हैं:

#!/bin/bash 

if [[ $# -ge 2 ]]; then 
    function __r { 
     if [[ $# -gt 1 ]]; then 
      exec join - "$1" | __r "${@:2}" 
     else 
      exec join - "$1" 
     fi 
    } 

    __r "${@:2}" < "$1" 
fi 

और पारित मापदंडों के रूप में फाइल की तरह स्क्रिप्ट के लिए:

bash script.sh file* 

या एक क्रमबद्ध रूप जैसे:

find -type f -maxdepth 1 -name 'file*' -print0 | sort -z | xargs -0 bash script.sh 
संबंधित मुद्दे