यह मूल आदेश में चीजों को नहीं मिलता है, लेकिन इस awk एक लाइनर काम करने के लिए लगता है:
awk '{for(i=1;i<=length($0);i++){a[substr($0,i,1)]=1} for(i in a){printf("%s",i)} print "";delete a}' input.txt
स्प्लिट के अलावा आसानी से पढ़ने के लिए, यह हो सकता है स्टैंड-अलोन इस तरह:
#!/usr/bin/awk -f
{
# Step through the line, assigning each character as a key.
# Repeated keys overwrite each other.
for(i=1;i<=length($0);i++) {
a[substr($0,i,1)]=1;
}
# Print items in the array.
for(i in a) {
printf("%s",i);
}
# Print a newline after we've gone through our items.
print "";
# Get ready for the next line.
delete a;
}
बेशक
, इसी अवधारणा बहुत आसानी से शुद्ध बैश में रूप में अच्छी तरह से लागू किया जा सकता है:
#!/usr/bin/env bash
while read s; do
declare -A a
while [ -n "$s" ]; do
a[${s:0:1}]=1
s=${s:1}
done
printf "%s" "${!a[@]}"
echo ""
unset a
done < input.txt
ध्यान दें कि यह साहचर्य सरणी की वजह से पार्टी 4 पर निर्भर करता है,। और यह एक चीजें मूल क्रम में प्राप्त करता है, क्योंकि बैश अजीब की तुलना में सरणी कुंजियों को रखने का बेहतर काम करता है।
और मुझे लगता है कि आपको जोस से sed
का उपयोग करके समाधान मिला है, हालांकि इसमें अतिरिक्त पाइप-फिटिंग शामिल है। :)
आपके द्वारा उल्लिखित अंतिम टूल grep
था। मुझे पूरा यकीन है कि आप पारंपरिक grep में ऐसा नहीं कर सकते हैं, लेकिन शायद कुछ बहादुर आत्मा -o
और लुकराउंड का उपयोग कर एक पर्ल-रेगेक्सपी संस्करण (यानी grep -P
) बनाने में सक्षम हो सकती है। यद्यपि वे अभी मुझमें से अधिक कॉफी की आवश्यकता होगी।
यह छोटा है! ':;' और 't' क्या हैं? – user1436187
@ user1436187 जोड़ा गया स्पष्टीकरण – 123
और मैं इसे उत्तर के रूप में स्वीकार करता हूं! – user1436187