tags:

views:

52

answers:

5

I have a script that generates two lines as output each time. I'm really just interested in the second line. Moreover I'm only interested in the text that appears between a pair of #'s on the second line. Additionally, between the hashes, another delimiter is used: ^A. It would be great if I can also break apart each part of text that is ^A-delimited (Note that ^A is SOH special character and can be typed by using Ctrl-A)

A: 
your.program | tail +2 | cut -d# -f2 

should get you 2/3 of the way.

Grumdrig
Is cut the best utility to use on an undeterminate amount of values that are delimited by ^A?
syker
I'm not sure. I don't really understand what your goal is in terms of the ^A's. To turn them into something else? Line breaks?
Grumdrig
A: 

bash:

read
read line
result="${line#*#}"
result="${result%#*}"
IFS=$'\001' read result -a <<< "$result"

$result is now an array that contains the elements you're interested in. Just pipe the output of the script to this one.

Ignacio Vazquez-Abrams
A: 
output | sed -n '1p'  #prints the 1st line of output

output | sed -n '1,3p'  #prints the 1st, 2nd and 3rd line of output
N 1.1
+1  A: 

I'd probably use awk for that.

   your_script | awk -F# 'NR == 2 && NF == 3 { 
                            num_tokens=split($2, tokens, "^A")
                            for (i = 1; i <= num_tokens;  ++i) { 
                              print tokens[i]
                            } 
                          }' 

This says

1.  Set the field separator to #
2.  On lines that are the 2nd line, and also have 3 fields (text#text#text)
3.  Split the middle (2nd) field using "^A" as the delimiter into the array named tokens
4.  Print each token 

Obviously this makes a lot of assumptions. You might need to tweak it if, for example, # or ^A can appear legitimately in the data, without being separators. But something like that should get you started. You might need to use nawk or gawk or something, I'm not entirely sure if plain awk can handle splitting on a control character.

janks
A: 

here's a possible awk solution

awk -F"#" 'NR==2{
 for(i=2;i<=NF;i+=2){
  split($i,a,"\001") # split on SOH
  for(o in a ) print o # print the splitted hash
 }
}' file
ghostdog74