एक टैब द्वारा कई रिक्त स्थान कैसे बदलें


27

मेरे पास कुछ पाठ फाइलें हैं जिनमें विभिन्न संख्या में रिक्त स्थान द्वारा अलग किए गए कुछ कॉलम हैं, लेकिन इसके बजाय मुझे विभाजक के रूप में एक टैब की आवश्यकता है। क्या बाश में करना संभव है?


महान इनपुट के लिए धन्यवाद, लेकिन मेरे पास एक कॉलम के अंदर कुछ एकल स्थान हैं, इसलिए मुझे एकल स्थान को टैब करने से बचना होगा। इसके लिए खेद है, isinformation।
user_unknown

जवाबों:


31

एक से अधिक स्थानों के दृश्यों को एक टैब में बदलने के लिए, लेकिन अलग-अलग स्थानों को अकेला छोड़ दें :

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: `.'
एरोन फ्रेंके

@AaronFranke: आपने किस आदेश की कोशिश की? मेरे जवाब में कोई भी उदाहरण उस त्रुटि का उत्पादन नहीं करना चाहिए।
अगली सूचना तक रोक दिया गया।

क्षमा करें, मुझे स्पष्ट करना चाहिए था। findतल पर एक।
हारून फ्रेंक

@AaronFranke: जीएनयू sedको बैकअप एक्सटेंशन से पहले जगह पसंद नहीं है। मैंने अपना उत्तर संपादित कर दिया है। रिपोर्ट के लिए धन्यवाद।
अगली सूचना तक रोक दिया गया।

7

यदि आपका चरित्र कई टैब है तो आप इसका उपयोग भी कर सकते हैं 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 " "

सभी सफेद रिक्त स्थान एक हो जाएंगे।


यह वह नहीं है जो ओपी पूछ रहा है।
रॉनजॉन

5

आप sedटैब के साथ कई स्थान बदलने के लिए उपयोग कर सकते हैं :

एक टैब के साथ एक या अधिक-रिक्त स्थान बदलने के लिए उदाहरण:

cat spaced-file | sed 's/ \+/\t/g' > tabbed-file

ओपी ने कहा कि रिक्त स्थान की संख्या परिवर्तनशील थी , इसलिए मुझे नहीं लगता कि यह समाधान काम करेगा।
मिकेल

@Mikel। उफ़। यह बात बताने के लिए धन्यवाद। मैंने चर स्थानों के लिए मिलान की अनुमति देने के लिए पोस्ट को संपादित किया है।
IvanGoneKrazy

सबसे उपयोगी जवाब यहाँ।
लुइस डी सूसा

3

केवल इसका उपयोग करने का सबसे आसान उत्तर 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


2

निम्न SED स्क्रिप्ट आज़माएं:

 sed 's/  */<TAB>/g' <spaces-file > tabs-file

जहां <TAB> TAB कुंजी दबा रहा है।


0

यह एक बहुत ही सरल उपाय है:

    sed -E 's/\s+/\t/g' your_file > new_file

sed मूल रूप से इस तरीके से काम करता है (sed 's / old_pattern / new_pattern / g')। इस मामले में पुराना पैटर्न "\ s +" है जिसका अर्थ है कि नियमित अभिव्यक्ति के रूप में व्याख्या करने के लिए स्थान "s" एक या अधिक समय "+" और बैक स्लैश "\" है।
नया पैटर्न टैब "\ t" है जो नियमित अभिव्यक्ति प्रारूप में लिखा गया है और "जी" सभी लाइनों के प्रतिस्थापन को "विश्व स्तर पर" लागू करता है।


1
नमस्कार और सुपरयुसर का स्वागत है। आपको अपना समाधान समझाने के लिए समय निकालना चाहिए। * Nix सिस्टम, सेड और रेगुलर एक्सप्रेशन से परिचित नहीं किसी के लिए, यह अजीब पात्रों के ढेर जैसा दिखता है।
मोगेट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.