নির্দিষ্ট অক্ষরে তালিকা কীভাবে সারিবদ্ধ করা যায়?


13

একটি আদেশ বা স্বতন্ত্র চরিত্রের সাথে পাঠ্যের লাইনগুলি অনুভূমিকভাবে সারিবদ্ধ করতে আমি ব্যবহার করতে পারি এমন কমান্ডের সেট বা সেট রয়েছে? উদাহরণস্বরূপ, ইমেল ঠিকানার একটি তালিকা সহ আউটপুট উল্লিখিতভাবে সমস্ত '@' অক্ষর যুক্ত একটি টেক্সট ফাইল তৈরি করবে।

সফল হতে আমি বিশ্বাস করি যে বেশিরভাগ লাইনের শুরুতে একটি চলক সংখ্যা খালি স্পেস যুক্ত করতে হবে। আমি আলাদা কলামগুলি চাই না কারণ তারা পড়তে আরও বেশি প্রচেষ্টা নেয় (উদাহরণস্বরূপ column -t -s "@" < file.txt)।

আগে:

123@example.com
456789@example.net
01234@something-else.com

পরে:

   123@example.com
456789@example.net
 01234@something-else.com

অন্যভাবে বলুন: আমি কোনও অ্যাঙ্কর পয়েন্ট হতে একটি চরিত্র নির্দিষ্ট করতে পারি, যার চারপাশে আশেপাশের পাঠ্যটি অনুভূমিকভাবে কেন্দ্রীভূত হয়? এগুলির জন্য আমার ব্যবহারের ক্ষেত্রটি হল ইমেল ঠিকানাগুলি, যাতে তাদের দৃষ্টি সহজে স্ক্যান করা সহজ হয়।


1
একাধিক @চিহ্ন থাকলে কী হবে ?
জিটা

ভাল প্রশ্ন, একাধিক @প্রতীক ইমেল ঠিকানাগুলির সাথে একটি সমস্যা হওয়া উচিত নয় তবে ব্যবহারকারীর লাইন প্রতি একটি বর্ণের উদাহরণটি 'অ্যাঙ্কর' হতে হবে যা অন্য পাঠ্যটিকে কেন্দ্রিক করা উচিত select
টম ব্রসম্যান

1
একাধিক @চিহ্ন, ইমেল ঠিকানা অনুমতি দেওয়া হয় যেমন tom"@brossmann"@example.com। সে কারণেই আমি জিজ্ঞাসা করেছি যদি একাধিক @চিহ্ন থাকে তবে কী ঘটতে হবে :)।
জিটা

@ জেটা একাধিক @প্রতীককে বিভিন্ন ইমেল পরিষেবাদিতে অনুমোদিত নয়। আপনি যদি কাঁচা, ছাঁটাই না করা ব্যবহারকারী ইনপুট নিয়ে কাজ না করেন তবে "সাধারণ" ইমেলগুলি "সত্য" এর চেয়ে শক্ততর মানদণ্ডের সাথে প্রত্যাশা করা সম্পূর্ণভাবে যুক্তিসঙ্গত, আপনি যদি কোনও ক্ষেত্রেই লেনের সাথে লেনদেন করার সম্ভাবনা বেশি করেন তবে @
মনিকা এর মামলা

উত্তর:


3

না আওক। কেবল sedএবং column:

column -ts@ file.txt | sed -E 's/([^ ]+)([ ]+) (.+)/\2\1@\3/'

আউটপুট:

   123@example.com
456789@example.net
 01234@something-else.com

এখন, আমি যা ভাবছি, এটি প্রায় সন্দীপের সমাধান হিসাবে একই, এটি কেবল সংক্ষিপ্ত দেখাচ্ছে / কম কল করেছে sed, এবং এটি ধরেও নিয়েছে যে @প্রতিটি লাইনে একবারেই ঘটেছিল।


1
এটি আরও সংক্ষিপ্ত হতে পারে:column -ts@ input.txt | sed -r 's/([^ ]+)( *)\s\s/\2\1@/'
মিনিম্যাক্স

11

এর সরলতমতম সময়ে, আপনি কেবলমাত্র উপযুক্ত ফিল্ডউইথ যেমন প্রথম ক্ষেত্রটি মুদ্রণ করতে পারেন

awk -F@ 'BEGIN{OFS=FS} {$1 = sprintf("%12s", $1)} 1' file
         123@example.com
      456789@example.net
       01234@something-else.com

এএআইএআইএকি যে কোনও পদ্ধতি যা সুনির্দিষ্ট সর্বাধিক ফিল্ডউইথকে ধরে না নেয় তার জন্য হয় ফাইলটিকে মেমোরিতে রাখা বা দুটি পাস করা প্রয়োজন।


ভাল এক, দৈর্ঘ্য পেতে একটি ব্যবহার করতে পারেন cw=$(cut -d@ -f1 file | wc -L)এবং তারপরেawk -v w="$cw" 'BEGIN{OFS=FS="@"} {$1 = sprintf("%*s", w, $1)} 1'
সন্দীপ

এটি 328 ঠিকানার তালিকার বিপরীতে পরীক্ষা করে দশজন আউটপুট (এখন 318 লাইন) থেকে কোনওভাবে অনুপস্থিত। স্পষ্টতার জন্য, আমি দৌড়েছি awk -F@ '{a[$1] = $2; w = length($1) > w? length($1) : w; next} END {for (i in a) printf("%*s%c%s\n", w, i, FS, a[i])}' INPUT-FILE.txt > OUT.txt। এটি বাকীটি সুন্দরভাবে ফর্ম্যাট করেছিল তবে কিছু তথ্য অনুপস্থিত।
টম ব্রসম্যান

1
@ টমব্রসম্যান ধন্যবাদ আমি ঠিক বুঝতে পেরেছি এটির একটি মারাত্মক ত্রুটি রয়েছে - এটি অভিন্ন নাম ক্ষেত্রগুলি পরিচালনা করবে না - আমি
সেইটিকে

একই ফলাফল, তবে আরও সংক্ষিপ্তভাবেawk -F@ '{printf "%12s@%s\n", $1, $2}' input.txt
মিনিম্যাক্স

6

হ্যাকি সমাধান, ইনপুট পাঠ্য সম্পর্কে অনেক ধারনা করে

$ # four commas to reduce chance of it affecting actual email address
$ sed 's/@/,,,,@/' ip.txt | column -t -s,,,,
123     @example.com
456789  @example.net
01234   @something-else.com

$ sed 's/@/,,,,@/' ip.txt | column -t -s,,,, | sed -E 's/^([^ ]+)( +)/\2\1/'
     123@example.com
  456789@example.net
   01234@something-else.com

4

একটি দ্রুত পাইথন সমাধান যা সংক্ষিপ্ততম প্যাডিং দৈর্ঘ্যের ব্যবহার করে যা বিভাজকের বামে সমস্ত স্ট্রিং ডানদিকে সামঞ্জস্য করে:

#!/usr/bin/env python3
import sys
fieldsep = '@'
records = [line.rstrip('\n').split(fieldsep, 1) for line in sys.stdin]
col1_len = max((len(r[0]) for r in records), default=0)
for r in records:
    print(r[0].rjust(col1_len), r[1], sep=fieldsep)

ব্যবহার:

python3 align-field.py < data.txt

2

আর একটি জিএনইউ awk+ columnসমাধান:

awk '{ split($0,a,/ +/,sep); printf "%*s@%s\n",length($1 sep[1])-2,$1,$2 }' <(column -ts'@' file)

আউটপুট:

   123@example.com
456789@example.net
 01234@something-else.com

এটি কীভাবে কাজ করে সে সম্পর্কে আপনি কিছুটা যুক্ত করতে পারেন?
জো

2

এটি বাশ স্ট্রিং ম্যানিপুলেশন সহও কাজ করতে পারে।

বাশ স্ক্রিপ্ট (4.x):

#!/bin/bash

read -d '' -r -a data <"data.txt"

for ((pos=0, i=0; i<${#data[@]}; i++)); do
    locl=${data[$i]%@*}                         # The local-part.
    [[ ${#locl} -gt $pos ]] && pos=${#locl}     # Determine the lengthiest $locl.
done

for ((i=0; i<${#data[@]}; i++)); do
    email=${data[$i]}
    locl=${email%@*}                            # The local-part.
    domain=${email#*@}                          # The email domain.
    printf '%*s@%s\n' $pos $locl $domain        # Align $locl to the right, at $pos.
done

ফলাফল:

   123@example.com
456789@example.net
 01234@something-else.com
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.