मेरे पास कुछ पाठ फाइलें हैं जिनमें विभिन्न संख्या में रिक्त स्थान द्वारा अलग किए गए कुछ कॉलम हैं, लेकिन इसके बजाय मुझे विभाजक के रूप में एक टैब की आवश्यकता है। क्या बाश में करना संभव है?
मेरे पास कुछ पाठ फाइलें हैं जिनमें विभिन्न संख्या में रिक्त स्थान द्वारा अलग किए गए कुछ कॉलम हैं, लेकिन इसके बजाय मुझे विभाजक के रूप में एक टैब की आवश्यकता है। क्या बाश में करना संभव है?
जवाबों:
एक से अधिक स्थानों के दृश्यों को एक टैब में बदलने के लिए, लेकिन अलग-अलग स्थानों को अकेला छोड़ दें :
sed 's/ \+ /\t/g' inputfile > outputfile
कई फ़ाइलों के लिए ऐसा करने के लिए:
for inputfile in *
do
sed 's/ \+ /\t/g' "$inputfile" > tmpfile && mv tmpfile "$inputfile"
done
या
for inputfile in *
do
sed -i.bak 's/ \+ /\t/g' "$inputfile"
done
या
find . -type f -exec sed -i.bak 's/ \+ /\t/g' {} \;
sed: -e expression #1, char 1: unknown command: `.'
find
तल पर एक।
sed
को बैकअप एक्सटेंशन से पहले जगह पसंद नहीं है। मैंने अपना उत्तर संपादित कर दिया है। रिपोर्ट के लिए धन्यवाद।
यदि आपका चरित्र कई टैब है तो आप इसका उपयोग भी कर सकते हैं tr -s
:
-s, --squeeze-repeats replace each input sequence of a repeated character
that is listed in SET1 with a single occurrence
उदाहरण के लिए:
my_file.txt | tr -s " "
सभी सफेद रिक्त स्थान एक हो जाएंगे।
आप sed
टैब के साथ कई स्थान बदलने के लिए उपयोग कर सकते हैं :
एक टैब के साथ एक या अधिक-रिक्त स्थान बदलने के लिए उदाहरण:
cat spaced-file | sed 's/ \+/\t/g' > tabbed-file
केवल इसका उपयोग करने का सबसे आसान उत्तर bash
है:
while read -r col1 col2 col3 ...; do
echo -e "$col1\t$col2\t$col3..."
done <file
यदि स्तंभों की एक चर संख्या है, तो आप ऐसा कर सकते हैं, लेकिन यह केवल इसमें काम करेगा bash
, नहीं sh
:
while read -r -a cols; do
(
IFS=$'\t'
echo "${cols[*]}"
)
done <file
जैसे
while read -r -a cols; do
(
IFS=$'\t'
echo "${cols[*]}"
)
done <<EOF
a b c
d e f
g h i
EOF
पैदा करता है:
a b c
d e f
g h i
(प्रत्येक के बीच में एक टैब है, लेकिन यह देखना मुश्किल है कि कब मैं इसे यहां पेस्ट करूं)
आप इसका उपयोग sed
या भी कर सकते हैं tr
, लेकिन ध्यान दें कि प्रारंभ में रिक्त स्थान की हैंडलिंग अलग परिणाम उत्पन्न करती है।
sed:
$ sed 's/ */\t/g' << EOF
a b c
d e f
g h i
EOF
a b c
d e f
g h i
tr:
$ tr -s ' ' '\t' <<EOF
a b c
d e f
g h i
EOF
a b c
d e f
g h i
perl -p -i -e 's/\s+/\t/g' *.txt
यह एक बहुत ही सरल उपाय है:
sed -E 's/\s+/\t/g' your_file > new_file
sed मूल रूप से इस तरीके से काम करता है (sed 's / old_pattern / new_pattern / g')। इस मामले में पुराना पैटर्न "\ s +" है जिसका अर्थ है कि नियमित अभिव्यक्ति के रूप में व्याख्या करने के लिए स्थान "s" एक या अधिक समय "+" और बैक स्लैश "\" है।
नया पैटर्न टैब "\ t" है जो नियमित अभिव्यक्ति प्रारूप में लिखा गया है और "जी" सभी लाइनों के प्रतिस्थापन को "विश्व स्तर पर" लागू करता है।