हम पंक्तियों और स्तंभों पर एक टेक्स्ट फ़ाइल को सब्सक्राइब करना चाहते हैं, जहां फ़ाइल से पंक्तियां और स्तंभ संख्याएं पढ़ी जाती हैं। हेडर को छोड़कर (पंक्ति 1) और राउनम्स (कॉल 1)।पंक्ति और कॉलम संख्याओं द्वारा फ़ाइल को सब्सक्राइब करें
inputFile.txt टैब सीमांकित पाठ फ़ाइल
header 62 9 3 54 6 1
25 1 2 3 4 5 6
96 1 1 1 1 0 1
72 3 3 3 3 3 3
18 0 1 0 1 1 0
82 1 0 0 0 0 1
77 1 0 1 0 1 1
15 7 7 7 7 7 7
82 0 0 1 1 1 0
37 0 1 0 0 1 0
18 0 1 0 0 1 0
53 0 0 1 0 0 0
57 1 1 1 1 1 1
subsetCols.txt कॉमा कोई रिक्त स्थान, एक पंक्ति, संख्या का आदेश दिया साथ अलग कर दिया। वास्तविक डेटा में हमारे पास 500 के कॉलम हैं, और ~ 10K को सब्सक्राइब करने की आवश्यकता है।
1,4,6
subsetRows.txt कॉमा कोई रिक्त स्थान, एक पंक्ति, संख्या का आदेश दिया साथ अलग कर दिया। वास्तविक डेटा में हमारे पास 20K पंक्तियां हैं, और लगभग 300 के लिए सब्सक्राइब करने की आवश्यकता है।
1,3,7
वर्तमान समाधान कटौती और awk लूप (Related post: Select rows using awk) का उपयोग:
# define vars
fileInput=inputFile.txt
fileRows=subsetRows.txt
fileCols=subsetCols.txt
fileOutput=result.txt
# cut columns and awk rows
cut -f2- $fileInput | cut -f`cat $fileCols` | sed '1d' | awk -v s=`cat $fileRows` 'BEGIN{split(s, a, ","); for (i in a) b[a[i]]} NR in b' > $fileOutput
आउटपुट फ़ाइल: result.txt
1 4 6
3 3 3
7 7 7
प्रश्न:
यह समाधान छोटी फ़ाइलों के लिए ठीक काम करता है, बड़ी फ़ाइलों 50K पंक्तियों और 200 के कॉलम के लिए, यह बहुत लंबा लग रहा है, 15 मिनट प्लस, अभी भी चल रहा है। मुझे लगता है कि कट कॉलम कॉलिंग ठीक काम करता है, पंक्तियों का चयन धीमा बिट है।
कोई बेहतर तरीका?
# $fileInput:
# Rows = 20127
# Cols = 533633
# Size = 31 GB
# $fileCols: 12000 comma separated col numbers
# $fileRows: 300 comma separated row numbers
अधिक फ़ाइल के बारे में जानकारी: फ़ाइल GWAS जीनोटाइप डेटा शामिल
रियल इनपुट जानकारी फ़ाइलें। प्रत्येक पंक्ति नमूना (व्यक्तिगत) का प्रतिनिधित्व करती है और प्रत्येक कॉलम SNP का प्रतिनिधित्व करता है। आगे के क्षेत्र आधारित विश्लेषण के लिए हमें r जैसे अन्य सांख्यिकीय सॉफ़्टवेयर के लिए इनपुट के रूप में डेटा को अधिक प्रबंधनीय (छोटा) बनाने के लिए नमूनों (पंक्तियों) और एसएनपी (कॉलम) को सब्सक्राइब करने की आवश्यकता है।
सिस्टम:
$ uname -a
Linux nYYY-XXXX ZZZ Tue Dec 18 17:22:54 CST 2012 x86_64 x86_64 x86_64 GNU/Linux
अद्यतन: समाधान @JamesBrown से नीचे प्रदान की अपने सिस्टम में स्तंभों की आदेश मिश्रण किया गया था, के रूप में मैं awk के विभिन्न संस्करण का उपयोग कर रहा है, मेरे संस्करण है: GNU Awk 3.1.7
जैसा कि मैंने आपकी समस्या को काफी रोचक पाया है, मैं अभी भी आपके संपादन पढ़ने के आसपास हूं। मैं प्रसंस्करण को तेज करने के लिए दोनों बहुत अच्छे उत्तरों पर कुछ सुधारों के साथ आया था और यह गैर-gnu awk के साथ भी काम करता है। – anubhava