प्रत्येक पंक्ति को कई बार दोहराएं


17

फ़ाइल की प्रत्येक पंक्ति को एक निश्चित संख्या में दोहराया जाना पसंद करेंगे।

उदाहरण के लिए प्रत्येक पंक्ति को चार बार दोहराया गया है:

a
b
c

हो जाता है:

a
a
a
a
b
b
b
b
c
c
c
c

मैंने कुछ खोज की है, और रिवर्स करने की रेखाओं के साथ बहुत सारे प्रश्न और उत्तर हैं, उदाहरण के लिए, डुप्लिकेट लाइनों को एकल लाइनों में मर्ज करना, और शायद उन्हें फिर से प्रिंट करके लाइनों के दोहरीकरण के बारे में कुछ।

सी में ऐसा करना आसान होगा, लेकिन मैं चाहता हूं कि मैं देशी कमांड्स के बारे में अधिक जानता था, इसलिए मुझे हर समय इस तरह के एक-ऑफ थ्रो-एयरवेज का सहारा नहीं लेना पड़ेगा।

जवाबों:


19
  • पर्ल:

    perl -ne 'for$i(0..3){print}' file

    और मुझे इस पोस्ट को @derobert द्वारा टिप्पणी के रूप में जोड़ना होगा क्योंकि यह सिर्फ अच्छा है:

    perl -ne 'print "$_" x4'
  • awk और वेरिएंट:

    awk '{for(i=0;i<4;i++)print}' file
  • bash

    while read line; do for i in {1..4}; do echo "$line"; done; done < file

1
awk'एस forब्रेसिज़ की जरूरत नहीं है, तो सिर्फ एक ही आदेश को दोहराने के लिए है। और perlसरल है यदि आप foreachलूप का उपयोग करते हैं for$i(0..3){print}:।
मैनेटवर्क

4
वैकल्पिक पर्ल perl -ne 'print(($_)x4)':। इसके अलावा, आपको $lineअपने बैश संस्करण में (ईको में) उद्धरण देना चाहिए ।
derobert

मेरे मामले में मुझे विंडोज लाइन-एंडिंग की आवश्यकता थी। के रूप में यहाँ देखा के साथ प्राप्त कर सकते हैंBEGIN { ORS="\r\n" }
लाल मटर

34

मुझे आश्चर्य है कि अगर यह एक गोल्फ मैच में बदल रहा है :

sed 'p;p;p' 
awk '1;1;1;1' 
perl -lpE 'say;say;say'   # if Paul McCartney and Michael Jackson were hackers...

स्पष्टीकरण:

sed की pकमांड करंट लाइन को प्रिंट करना है। डिफ़ॉल्ट व्यवहार अगली पंक्ति में जाने से ठीक पहले करंट लाइन को प्रिंट करना है (इसीलिए sed को -nआपको इसे बंद करने की अनुमति देनी होगी)। कुछ पुराने सेड्स में अर्धविराम (मुझे नहीं लगता) है इसलिए यह संभव है कि आपको करना पड़ सकता हैsed -e p -e p -e p

अजक condition {action}जोड़े के साथ काम करता है । यदि कार्रवाई छोड़ दी जाती है, तो शर्त सही होने पर डिफ़ॉल्ट को वर्तमान लाइन प्रिंट करना है। कई सी-लाइक लैंग्वेज की तरह अवाक भी 1सच मान लेता है। (पूर्णता के लिए, यदि शर्त को छोड़ दिया जाता है, तो कार्रवाई प्रत्येक रिकॉर्ड के लिए निष्पादित की जाएगी।)

कई पर्ल फ़ंक्शन "डिफ़ॉल्ट" चर का लाभ उठाते हैं। यह वन-लाइनर (पर्ल 5.16 पर) के बराबर है:

$ perl -MO=Deparse -lpE 'say;say;say'
BEGIN { $/ = "\n"; $\ = "\n"; }
use feature 'current_sub', 'evalbytes', 'fc', 'say', 'state', 'switch', 'unicode_strings', 'unicode_eval';
LINE: while (defined($_ = <ARGV>)) {
    chomp $_;
    say $_;
    say $_;
    say $_;
}
continue {
    die "-p destination: $!\n" unless print $_;
}

1
+1, यदि यह है, तो आप जीत रहे हैं :) क्या वास्तव 1में जाग में क्या करता है ? आशुलिपि के लिए print $0?
terdon

3
Awk स्टेटमेंट एक शर्त और एक ब्लॉक से बने होते हैं, या तो वैकल्पिक होते हैं, लेकिन एक मौजूद होना चाहिए। डिफ़ॉल्ट स्थिति 1(सत्य) है; डिफ़ॉल्ट ब्लॉक के बराबर है {print}। तो बयान 1का मतलब वर्तमान लाइन बफर ( {print}) प्रिंट करना होगा । ( {print}और {print $0}ज्यादातर एक ही हैं, qed।)
Arcege

मैंने कभी नहीं सुना है sedकि कमांड टर्मिनेटर के रूप में अर्धविराम का समर्थन नहीं करता है; क्या वास्तव में ऐसा है?
वाइल्डकार्ड


4

आप की आवश्यकता के बिना ऐसा कर सकते हैं sed, perlया awk

$ for i in `cat <file>` ; do seq <#> <#> | xargs -i -- echo $i ; done

या थोड़ी देर के लूप का उपयोग करके:

$ while read i ; do seq <#> <#> | xargs -i -- echo $i ; done < <file>

उदाहरण

पाश के लिए
$ for i in `cat sample.txt` ; do seq 1 3 | xargs -i -- echo $i ; done
a
a
a
b
b
b
c
c
c
घुमाव के दौरान
$ while read i; do seq 1 2| xargs -i -- echo $i;done < sample.txt
a
a
b
b
c
c

मुझे लगता है कि लूप संस्करण के लिए व्हॉट्सएप युक्त किसी भी लाइन पर टूट जाएगा, इसलिए लूप को प्राथमिकता दी जानी चाहिए। अन्यथा, +1 चूंकि मैं शेल समाधानों के लिए एक चूसने वाला हूं।
ईविल

@evilsoup - हाँ किसी और ने इसका उल्लेख किया और साथ ही कुछ कोड पर मैंने एक और प्रश्नोत्तर पर पोस्ट किया। मुझे लगता है कि उस समय के लिए प्राथमिक लाभ, जबकि लूप $ IFS विभाजक के लिए सहिष्णु है और एंड-ऑफ-लाइन पर विभाजित होगा जबकि $ IFS पर विभाजन के लिए।
SLM

1

विशुद्ध रूप से शेल का उपयोग करना:

repeats=4
while read line; do yes $line|head --lines=$repeats; done < infile > outfile

क्या कोई जानता है कि कैसे हाँ --helpको एक विकल्प के बजाय एक स्ट्रिंग के रूप में माना जाता है? [मामले पर विचार जहां lineहै --helpया किसी अन्य विकल्प]
user176581

जी हाँ,yes -- --help
don_crissti

उपयोग करना yesऔर headइसका मतलब यह "विशुद्ध रूप से खोल" नहीं है
ग्लेन जैकमैन

1

यह आपके लिए काम कर सकता है (GNU sed):

sed 'h;:a;s/[^\n]\+/&/4;t;G;ba' file

प्रत्येक पंक्ति को 4 बार दोहराएंगे।

या यदि आप पसंद करते हैं:

sed 'h;:a;s/\n/&/3;t;G;ba' file

जहां आप प्रत्येक पंक्ति को 3 बार दोहराते हैं।


1

@potong का जवाब खाली लाइनों के साथ काम नहीं करता है, इसके \+साथ *इसे ठीक करना चाहिए:

sed 'h;:a;s/[^\n]*/&/4;t;G;ba' file
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.