XY से अधिक लंबी लाइन को कैसे हटाएं?


21

यदि यह उदाहरण के लिए: 2048 वर्ण से अधिक लंबा है तो मैं एक पंक्ति को कैसे हटा सकता हूं?


क्या आप sed का उपयोग करने पर जोर देते हैं? यह आसान है, उदाहरण के लिए अजगर में। और कोई संदेह भी पर्ल में आसान नहीं है। हालांकि सवाल बहुत अच्छी तरह से परिभाषित नहीं है। 2048, या कुछ और की तुलना में लंबी सभी लाइनों को हटाने, एक फ़ाइल की प्रतिलिपि बनाएँ?
फहीम मीठा

जवाबों:


22
sed '/^.\{2048\}./d' input.txt > output.txt

3
मुझे त्रुटि संदेश मिलता है sed: 1: "/^.\{2048\}..*/d": RE error: invalid repetition count(s)(मैक ओएस एक्स)
वेदी

1
@wedi शायद आप BSD संस्करण के बजाय GNU संस्करण को स्थापित करना चाहते हैं जो मैक के साथ जहाज करता है। यह काढ़ा के साथ आसान है
Freedom_Ben

सवाल कहता है "अगर XY से अधिक (जैसे, 2048 चार्ट)"। फिर यह> 2048 होना चाहिए और न => 2048
ajcg

1
@ajcg, यह> 2048 है। ध्यान दें कि 2049 वें चरित्र से मेल खाने के लिए रेगेक्स के अंत में एक अतिरिक्त अवधि है।
फ़ोर्सफ़स्क

अगर आप इसे "^" से दूर कर लेते हैं तो @forcefsck और बेहतर नहीं होगा। (आपकी आज्ञा से आप केवल "XYZ से शुरू होने वाली" पंक्तियों को हटा रहे हैं, लेकिन अगर XYZ लाइन के दूसरे हिस्से में है तो यह इसे डिलीट नहीं करता है)
ajcg

7

यहां एक समाधान है जो 2049 या अधिक वर्ण वाली रेखाओं को हटाता है:

sed -E '/.{2049}/d' <file.in >file.out

अभिव्यक्ति /.{2049}/dकिसी भी लाइन से मेल खाएगी जिसमें कम से कम 2049 अक्षर हों और उन्हें इनपुट से हटा दिया जाए, जिससे आउटपुट पर केवल छोटी लाइन बनती है।

awk2048 या उससे कम लंबाई की छपाई लाइनों के साथ :

awk 'length <= 2048' <file.in >file.out

sedसमाधान का शाब्दिक रूप से नकल करना awk:

awk 'length >= 2049 { next } { print }' <file.in >file.out

1
मुझे त्रुटि संदेश मिलता है sed: 1: "/^.\{400,\}$/d": RE error: invalid repetition count(s)(मैक ओएस एक्स)
वेदी

1
@wedi अब macOS Mojave पर अपडेट और परीक्षण किया गया है।
Kusalananda

2

पायथन में कुछ इस तरह से काम करना चाहिए।

of = open("orig")
nf = open("new",'w')
for line in of:         
    if len(line) < 2048:
        nf.write(line)
of.close()
nf.close()

1
निजी तौर पर, @ फहीम, मैं आपका जवाब पसंद करता हूं। इसका कारण यह है कि मेरे लिए इसे 'x से छोटी सभी पंक्तियों को हटाना' में बदलना बहुत आसान था। मैं हर समय अजगर का उपयोग नहीं करता, लेकिन जब मैं करता हूं तो मुझे हमेशा लगता है कि मुझे इसे अच्छी तरह से सीखना चाहिए।
ixtmixilix

@ixtmixilix: हाँ, पाइथन जैसी पूर्ण विशेषताओं वाली भाषा का उपयोग करना बहुत ही लचीला है। टिप्पणी के लिए धन्यवाद।
फहीम मीठा

2
perl -lne "length < 2048 && print" infile > outfile

+1 की -lआवश्यकता नहीं है, यद्यपि।
जोसेफ आर।

मेरे लिए काम नहीं करता है। पर्ल v5.16.2। Warning: Use of "length" without parentheses is ambiguous at -e line 1. Unterminated <> operator at -e line 1.
वेदी

आप कोशिश कर सकते हैं length($_) > 2048 && print। वैसे भी lengthएक शॉर्टकट length($_)है।
मराठ

0

उपर्युक्त उत्तर मेरे लिए Mac OS X 10.9.5 पर काम नहीं करते हैं।

निम्नलिखित कोड काम करता है:

sed '/.\{2048\}/d'

यद्यपि पूछा नहीं गया है, लेकिन संदर्भ के लिए प्रदान किया गया है, रिवर्स को निम्नलिखित कोड प्राप्त किया जा सकता है:

sed '/.\{2048\}/!d'


योग्य, लेकिन sed: 1: "/.\{2048\}/d": RE error: invalid repetition count(s)( Mac OS X, 10.10.4)
एलेक्स ग्रे

आह। मैंने BSD संस्करण के बजाय GNU संस्करण स्थापित किया है जो कि @Freedom_Ben के रूप में मैक के साथ जहाज ऊपर सुझाया गया है। लेकिन कुसलानंद ने विस्तारित रेगेक्स को सक्षम करने के लिए स्विच पाया। तो आपको उसके समाधान के साथ जाना चाहिए यदि आपको अभी भी यह समस्या है। ;)
वेदी

0

ग्नू-सेड के साथ, आप एक खुले अंतराल को परिभाषित करने के लिए, बैकस्लैश टाइप करने से बचने के लिए, और कॉमा का उपयोग कर सकते हैं।

sed -r  "/.{2049,}/d" input.txt > output.txt

साथ में:

  • x {2049} का अर्थ बिल्कुल 2049 xs है
  • x {2049,3072} का अर्थ 2049 से 3072 xs है
  • x {2049,} का अर्थ है कम से कम 2049 xs
  • x {, 2049} सबसे अधिक 2049 xs पर अर्थ

अंतराल के लिए, बड़े पैटर्न से मेल न खाने के लिए, आपको लाइन एंकर की आवश्यकता होगी

sed -r  "/^.{32,64}$/d" input.txt > output.txt 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.