Help with awk, where line length and field position are variable


 
Thread Tools Search this Thread
Top Forums UNIX for Dummies Questions & Answers Help with awk, where line length and field position are variable
# 1  
Old 08-30-2013
Help with awk, where line length and field position are variable

I have several questions about using awk. I'm hoping someone could lend me a hand. (I'm also hoping that my questions make sense.)

I have a file that contains pipe separated data. Each line has similar data but the number of fields and the field position on each line is variable.
Code:
cheese64@server$ cat file.txt 

1234567890|bbb|ccc|ddd|eee|fff|ggg|hhh|iii|jjj|kkk|lll 
1234567890|bbb|ccc|ddd|eee|hhh|iii|jjj|kkk|lll

Using the example above, I need to extract specific data from the following fields. (Shown below.) I'm struggling because the data on each line could be in a different position.

Code:
1234567890|bbb|ccc|eee|jjj|kkk|lll

Running a command like this works on the first line but not the second.
Code:
awk '{FS="|"} {print $2"|"$3"|"$5"|"$9"|"$10"|"$11}' file.txt

What's the best way for me to extract data for these fields?

Next, how can I print everything from x-field to the end of the line, when the number of fields is unknown (fields 9, 10 and 11, as an example). I'm sure there's a better way to get the last three fields, for example, without enumerating each field.

The following awk command gives me everything from $6 on but will also print $1-$5 again.
Code:
awk '{FS="|"} {print $2"|"$3"|"$5"|"$NF}' file.txt

Lastly, is there a way to print part of a field, followed by other fields? Using the example above, I'd like to print the following:

Code:
123456|bbb|ccc|ddd|eee|fff|ggg|hhh|iii|jjj|kkk|lll

How can I cut the last four digits from the first field and continue to print the rest of the fields?

Thanks for the help -
# 2  
Old 08-30-2013
Hello,

Could you please try following code. It should help you.


Code:
awk -F "|" ' {v=""} {$6=$7=v} 1' data_new | sed 's/[[:space:]][[:space:]]//g; s/[[:space:]]/\|/g'


Output will nbe as follows.


Code:
1234567890|bbb|ccc|ddd|eee|hhh|iii|jjj|kkk|lll



Thanks,
R. Singh
# 3  
Old 08-30-2013
the NF variable is the number of fields in current record. You seem to require $1"|"$2"|"$3"|"$4"|"$5"|"$(NF -4)"|"$(NF -3)"|"$(NF -1)"|"$(NF -1)"|"$NF
# 4  
Old 08-30-2013
Try this (partly stolen from scynesaver):
Code:
awk -F\| '{sub (/....$/,"",$1); print $1, $2, $3, $4, $5, $6, $(NF-4), $(NF-3), $(NF-2), $(NF-1), $NF}' OFS=\| file
123456|bbb|ccc|ddd|eee|fff|hhh|iii|jjj|kkk|lll 
123456|bbb|ccc|ddd|eee|hhh|hhh|iii|jjj|kkk|lll

 
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Using awk to add length of matching characters between field in file

The awk below produces the current output, which will add +1 to $3. However, I am trying to add the length of the matching characters between $5 and $6 to $3. I have tried using sub as a variable to store the length but am not able to do so correctly. I added comments to each line and the... (4 Replies)
Discussion started by: cmccabe
4 Replies

2. Shell Programming and Scripting

awk to output the percentage of a field compared to length

The awk below using the sample input would output the following: Basically, it averages the text in $5 that matches if $7 < 30 . awk '{if(len==0){last=$5;total=$7;len=1;getline}if($5!=last){printf("%s\t%f\n", last,... (6 Replies)
Discussion started by: cmccabe
6 Replies

3. Shell Programming and Scripting

How to change variable length field?

Hello, I have a file with a date field with various lengths. For example: m/d/yyyy hh:mm or h:mm mm/dd/yyyy hh:mm or h:mm Is there a way using sed or awk to change the field to m/d/y ? I don't need the hours and minutes in that field, just the date in the proper format. Thanks in... (6 Replies)
Discussion started by: sonnyo916
6 Replies

4. Shell Programming and Scripting

Extract substring specif position and length from file line

Hi gurus, I am trying to figure out how to extract substring from file line (all lines in file), as specified position and specified legth. Example input (file lines) dhaskjdsa dsadhkjsa dhsakjdsad hsadkjh dsahjdksahdsad sahkjd sahdkjsahd sajkdh adhjsak I want to extract substring on... (5 Replies)
Discussion started by: ProsteJa
5 Replies

5. Shell Programming and Scripting

Flat file-make field length equal to header length

Hello Everyone, I am stuck with one issue while working on abstract flat file which i have to use as input and load data to table. Input Data- ------ ------------------------ ---- ----------------- WFI001 Xxxxxx Control Work Item A Number of Records ------ ------------------------... (5 Replies)
Discussion started by: sonali.s.more
5 Replies

6. UNIX for Dummies Questions & Answers

print variable length text from the middle of a line?

I am trying to get text from a webpage, in terminal form. So far I am: 1. getting the html for the page printed using curl (curl -s webpage.com), which is then 2. piped to awk, printing line number 29 (awk NR==29), then 3. this is where I am sort of lost. I know where in the printed line I... (7 Replies)
Discussion started by: darkfalz
7 Replies

7. Shell Programming and Scripting

perl or awk, field length check

Hi Everyone, 1.txt a;1234;134;1111111 b;123;123;1111111 c;123;1334;1111111 d;1234;1234;1111111 output a;1234;134;1111111 c;123;1334;1111111 d;1234;1234;1111111 if field2 legth>3 or field3 length >3, then output. Please advice. Thanks (4 Replies)
Discussion started by: jimmy_y
4 Replies

8. Shell Programming and Scripting

Inserting a line when its length is variable

Hi Unix experts I have simple text files in which the number of lines vary from one file to another. They look like the following: # # . . 34 46 76 72 39 68 I want to grab the first number of the last line of each file (let's say A= 39 in the above example), which is... (2 Replies)
Discussion started by: nxp
2 Replies

9. Shell Programming and Scripting

To trim Certain field in a line of a file and replace the new string in that position

To trim 3rd field in for all the lines of a file and replace the modified string in that particular field. For example i have a file called Temp.txt having content Temp.txt ----------------- 100,234,M1234 400,234,K1734 300,345,T3456 ---------------- So the modified file output should... (4 Replies)
Discussion started by: rpadhi
4 Replies

10. Shell Programming and Scripting

Deleting Characters at specific position in a line if the line is certain length

I've got a file that would have lines similar to: 12345678 x.00 xx.00 x.00 xxx.00 xx.00 xx.00 xx.00 23456781 x.00 xx.00 xx.00 xx.00 xx.00 x.00 xxx.00 xx.00 xx.00 xx.00 34567812 x.00 xx.00 x.00 xxx.00 xx.00 xx.00 xx.00 45678123 x.00 xx.00 xx.00 xx.00 xx.00 x.00 xxx.00 xx.00 xx.00 xx.00 xx.00... (10 Replies)
Discussion started by: Cailet
10 Replies
Login or Register to Ask a Question