awk problem


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting awk problem
# 1  
Old 03-17-2014
awk problem

Hi

I have two columns and I would like to create a third column based on how many lines away from a value of 1 in column 2,

for example I have

Code:
1,0
2,0
3,0
4,0
5,0
6,1
7,0
8,0
9,0
10,0
11,1

And I want an output

Code:
1,0,5
2,0,4
3,0,3
4,0,2
5,0,1
6,1,0
7,0,1
8,0,2
9,0,2
10,0,1
11,1,0

I'm stumped!

Many thanks in advance

Last edited by jim mcnamara; 03-17-2014 at 06:16 PM.. Reason: code tags
# 2  
Old 03-17-2014
In situations where you need to 'think back' like this I find it helpful to read the file twice... Once to figure it out, then again to modify and print.

Code:
$ awk -F, -v OFS="," 'NR==FNR { if($2 == 1) L++ ; A[L+0]++; next } # All lines of first file
FNR==1 {L=0} # First line of second file
{ if(A[L]<0) L++; $3=A[L]--; } 1' input input

1,0,5
2,0,4
3,0,3
4,0,2
5,0,1
6,1,0
7,0,5
8,0,4
9,0,3
10,0,2
11,1,1

$

For the first file, it counts up A[L] for each and every line. Every time it finds a 1, it increases L by one too. So A[0] is a count of how many lines were between it and the first one, etc.

The second file it does the exact opposite, counting down. Whenever A[L] goes negative, it increments L one.

It's not bidirectional like yours though yet. You might need to keep two counters and take the minimum.
# 3  
Old 03-18-2014
Looking through some of your earlier threads, it appears that you never use CODE tags, you never let us know if suggestions given to you work, and you almost never thank the volunteers here who try to help answer your questions.

It also seems that you want the volunteers here to act as your unpaid programming staff rather than to act as advisors to help you learn how to do your own coding.

This is an interesting puzzle, and Corona688 gave you a good starting point. I had to think about what you were trying to do for about ten minutes before I figured out a way to get what you want.

Can you explain the logic needed to solve your problem (even if you can't write the code for it)? What did you try to get the results you're looking for before you were stumped?
# 4  
Old 03-18-2014
Founded that your need a minimum number, it frustrated me.
Code:
$ awk '{a[NR]=$0}$2=="1"{p=s+1;s=NR;for(i=p;i<=s;i++){if(p==1){print a[i]","s-i}else{x=i-p+1<s-i?i-p+1:s-i;print a[i]","x}}}' FS=',' file
1,0,5
2,0,4
3,0,3
4,0,2
5,0,1
6,1,0
7,0,1
8,0,2
9,0,2
10,0,1
11,1,0

This User Gave Thanks to Lucas_0418 For This Post:
# 5  
Old 03-18-2014
@Lucas, there would be an issue still if the field2 in the last line is 0...
This User Gave Thanks to Scrutinizer For This Post:
# 6  
Old 03-18-2014
Hi Scrutinizer,
Thanks for reminding me, when I was coding, I felt that I am missing something like bound check, but when I saw the result is correct and there is another thing disturbed me then.
Apologize for my mistake. After added some code it may be fixed.
Code:
awk '{a[NR]=$0}$2=="1"{p=s+1;s=NR;for(i=p;i<=s;i++){if(p==1){print a[i]","s-i}else{x=i-p+1<s-i?i-p+1:s-i;print a[i]","x}}}
END{if(s!=FNR){for(i=s+1;i<=FNR;i++){print a[i]","i-s}}}' FS=',' file


Last edited by Lucas_0418; 03-18-2014 at 05:38 AM..
This User Gave Thanks to Lucas_0418 For This Post:
# 7  
Old 03-18-2014
Hi Lucas, no reason to apologize at all !

It appears to work now Smilie,

You might want to use more vertical real estate, it is a bit too long for one line
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

awk problem

i have an email list in file.txt with comma separated line1 - FIELD1,pippo@gmail.com,darth@gmail.com line2 - FIELD2,pippo@gmail.com,darth@gmail.com,sampei@gmail.com output=(awk -F ',' -v var="$awkvar" '$1==var {print $2,$3,$4}' spreadsheet.txt)but awk delete some letters at the... (8 Replies)
Discussion started by: pasaico
8 Replies

2. Shell Programming and Scripting

awk problem - combining awk statements

i have a datafile that has several lines that look like this: 2,dataflow,Sun Mar 17 16:50:01 2013,1363539001,2990,excelsheet,660,mortar,660,4 using the following command: awk -F, '{$3=strftime("%a %b %d %T %Y,%s",$3)}1' OFS=, $DATAFILE | egrep -v "\-OLDISSUES," | ${AWK} "/${MONTH} ${DAY}... (7 Replies)
Discussion started by: SkySmart
7 Replies

3. UNIX for Dummies Questions & Answers

Little problem with AWK

I thought I had solved this problem but after testing the script I came to realize that it is not doing what I need. So, here it goes again. This is the code: awk '/\>/{F=$2; N=$3; split(FILENAME, A, "."); getline; x = ">"}{print ">" A"-" x++" "F" " N"\n" $0}' This is the input file: ... (5 Replies)
Discussion started by: Xterra
5 Replies

4. Shell Programming and Scripting

awk problem

Find the number of files with sizes > 100KB in /, /bin, /usr, /usr/bin and /usr/sbin directories and output them in a two column format with the name of the directory and the number of files. i tried with awk $>ls -lh | awk '/^-/ && $5 >= 100k {print $8 $5}' but it is not working pls tell... (3 Replies)
Discussion started by: abhikamune
3 Replies

5. Shell Programming and Scripting

Problem with awk awk: program limit exceeded: sprintf buffer size=1020

Hi I have many problems with a script. I have a script that formats a text file but always prints the same error when i try to execute it The code is that: { if (NF==17){ print $0 }else{ fields=NF; all=$0; while... (2 Replies)
Discussion started by: fate
2 Replies

6. Shell Programming and Scripting

Awk problem: How to express the single quote(') by using awk print function

Actually I got a list of file end with *.txt I want to use the same command apply to all the *.txt Thus I try to find out the fastest way to write those same command in a script and then want to let them run automatics. For example: I got the file below: file1.txt file2.txt file3.txt... (4 Replies)
Discussion started by: patrick87
4 Replies

7. Shell Programming and Scripting

problem using awk

Hi there every body I'm new to shell scripting and there is a problem facing me,, please look at the following piece of code: awk ' BEGIN{ FS="<assertion id=\1"; RS="<assertion id=\"2"}/<assertion id=\"1/{print FS$2 > "/home/ds2/test/output.txt"} ' filename all I wanna do is to... (6 Replies)
Discussion started by: senior_ahmed
6 Replies

8. Shell Programming and Scripting

Problem with AWK

Hi All, How can i store a value of the unix command executed in AWK with system command. devise=`cut -c1-3 dvgp.txt` I wrote this command in awk as awk'{ code= sprintf("devise=`cut -c1-3 dvgp.txt`"); system(code); }' Is this correct. can you please suggest me how the code can be... (1 Reply)
Discussion started by: krishna_gnv
1 Replies

9. Shell Programming and Scripting

Problem with AWK

Hi all, How can i use the below unix command in AWK . Can any one please suggest me how i can use. sed -e "s/which first.sh/which \$0/g" $shell > $shell.sal where $0=current program name(say current.sh) $shell=second.sh (1 Reply)
Discussion started by: krishna_gnv
1 Replies

10. UNIX for Dummies Questions & Answers

AWK Problem

Hi, I posted something here about this yesterday but I can't seem to find it. I needed help writting a script which would append a file with new lines after every so many charachters. Example: (my original flat file) L60 LETTER OF CREDIT 60 DAYS W00 ON RECEIPT WIRE TRANSFER W30 NET... (12 Replies)
Discussion started by: gseyforth
12 Replies
Login or Register to Ask a Question

Featured Tech Videos