मेरे पास एक बैश पाइप है, उदा। $ src_prog | dst_prog.

मैं पाइप में कौन सी कमांड डाल सकता हूं ताकि हर सेकेंड बाइट चुपचाप निकल जाए?

मैं चाहता हूं कि dst_prog केवल बाइट 0,2,4,6 प्राप्त करें ...

पी.एस. इसे केवल ASCII या UTF8 नहीं, बल्कि बाइट के सभी मानों के लिए काम करने की आवश्यकता है।

2
fadedbee 13 नवम्बर 2019, 15:31
1
 – 
Inian
13 नवम्बर 2019, 15:56

3 जवाब

सबसे बढ़िया उत्तर

अपडेट किया गया एक और awk:

$ echo -ne abcdef\\n123456\\nåäö | 
LC_ALL=C awk -F "" '{
    for(i=1;i<=NF;i++)                # iterate all chars
        if(i%2!=p)                    # output every other char
            printf $i
    if(p=((p&&NF%2)||(!p&&!(NF%2))))  # xor                                     
        printf "\n"                   # handle newlines, all but the last
}'

आउटपुट:

ace
246��

आउटपुट को hexdump -C पर पाइप किया गया:

00000000  61 63 65 0a 32 34 36 c3  c3 c3 0a                 |ace.246....|
0000000b

यह नई पंक्तियों को संभालता है लेकिन अंतिम नई पंक्ति (echo -n के साथ विफल रहता है लेकिन डंप का अंत देखें)।

या शायद आप इस छोटे सी प्रोग्राम का उपयोग कर सकते हैं:

$ cat foo.c
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
  int c;
  int i=0;

  while((c=getchar()) != EOF) {
    if((i=!i)!=0)
      printf("%c",c);
  }
  exit(0);
}

फिर:

$ gcc -Wall foo.c && echo -n 1234äö | ./a.out | hexdump -C
00000000  31 33 c3 c3                                       |13..|
00000004
4
James Brown 14 नवम्बर 2019, 00:21

आप प्रत्येक एकल बाइट को fold के साथ सिंगल लाइन में डाल सकते हैं, awk के साथ विषम लाइनों को हटा सकते हैं और इसे tr के साथ वापस जोड़ सकते हैं:

echo abcdefgh12345678 | fold -b -w 1 |  awk 'NR%2==1' | tr -d "\n"
aceg1357

पी.एस. -b ध्वज अगर बाइट्स के लिए (वर्ण नहीं), लेकिन ऐसा लगता है कि यह केवल सिंगल बाइट टेक्स्ट डेटा (ASCII) के साथ काम करता है

1
shuvalov 13 नवम्बर 2019, 15:45
क्षमा करें, मुझे यह निर्दिष्ट करना चाहिए था कि इसे मनमानी, बाइनरी, डेटा के लिए काम करने की आवश्यकता है।
 – 
fadedbee
13 नवम्बर 2019, 15:49

आप रूबी का उपयोग कर सकते हैं:

$ cat a.out | wc -c
9456
$ cat a.out | ruby -ne '$_.each_char.with_index{|c,i| print c if i.even?}' | wc -c
4728

गिनती के बजाय वही लेकिन डंपिंग बाइट्स:

$ cat a.out | hexdump -Cn10
00000000  7f 45 4c 46 02 01 01 00  00 00         |.ELF......|
$ cat a.out | ruby -ne '$_.each_char.with_index{|c,i| print c if i.even?}' | hexdump -Cn10
00000000  7f 4c 02 01 00 00 00 00  02 3e         |.L.......>|
1
sergio MAGA 14 नवम्बर 2019, 01:04