awk help :(


 
Thread Tools Search this Thread
Top Forums UNIX for Dummies Questions & Answers awk help :(
# 1  
Old 02-22-2015
awk help :(

I need to know the row number of one column with some value but I don't know how. For example I want to know where is 3 of the first column in:

Code:
2  4
3  5
4  6
5  7

So I should get 2.

I have tried this:
Code:
awk '{if(NF==1){for(i=1;i<=NR;i++){if($i == $3) {print i}}}}' test.ssv

But it is not working

Could someone help me please? Smilie

Last edited by Scrutinizer; 02-22-2015 at 05:24 PM.. Reason: code tags
# 2  
Old 02-22-2015
Code:
awk '$1==3{print NR}' infile

OR
Code:
awk '$1==3{print FNR}' infile

From man page

Code:
NR  is the number of input records awk has processed since the beginning of the program's execution. 
NR is set each time a new record is read

FNR is the current record number in the current file. FNR is incremented each time a new record is read . 
It is reinitialized to zero each time a new input file is started.

# 3  
Old 02-22-2015
Quote:
Originally Posted by florpi
For example I want to know where is 3 of the first column in:

Code:
awk '{if(NF==1){for(i=1;i<=NR;i++){if($i == $3) {print i}}}}' test.ssv

"NF" is the (total) number of fields, which in your test data is 2 for every record. Therefore "if(NF==1)" will never be true at all.What you want to express (i suppose) is not "if the number of fields equals 1", but "if the field with the number 1 [equals some value]".

The content of the field number x is stored in a variable named "$x": "$1" holds the value of the first field, "$2" the value fo the second field and so on. You might want apply this new insight to your problem.

I hope this helps.

bakunin
# 4  
Old 02-22-2015
Thank you ! You're right Smilie

---------- Post updated at 09:59 AM ---------- Previous update was at 08:40 AM ----------

Sorry but I still have a problem because my data are too long and awk is too slow, do you know another way to solve it?
# 5  
Old 02-22-2015
For a value in the first column (assuming space is your column separator):
Code:
grep -n '^3 ' file | cut -d: -f1

for the second column:
Code:
grep -n '^[^ ][^ ]*  *3 ' file | cut -d: -f1

and so on. Admittedly not as flexible as awk. Note there are two spaces between "*" and "*". Or you can:
Code:
cut -d' ' -fN file | awk '...'

But this assumes a SINGLE space between fields.

Last edited by derekludwig; 02-22-2015 at 11:16 AM.. Reason: more... and typo
# 6  
Old 02-22-2015
Quote:
Originally Posted by florpi
Sorry but I still have a problem because my data are too long and awk is too slow, do you know another way to solve it?
Please elaborate on "slow": what do you mean by that? What does your real data look like? how big is your file? And what does your real awk script look like (not the one you showed us, the one which you really use)?

There is no point in suggesting anything without understanding the details of the problem - which you completely left out.

@derekludwig: i do not think your solutions will be any faster than awk: because all your suggestions include a pipeline the data have first to be read and then some part of them has to be read again. Given, this part is read from a datastream and not from disk, but still this means some additional work for the machine instead of less.

I hope this helps.

bakunin
# 7  
Old 02-22-2015
This
Code:
sed -n '/^3/=' file

is - on my system - about as fast as the awk above, but a factor of 2 - 3 slower than a grep alone.
If you're sure there's only one occurrence of your pattern, and it is early in the file, this
Code:
awk '$1==3{print NR; exit}' file

will accelerate the awk solution significantly.
 
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

awk output yields error: awk:can't open job_name (Autosys)

Good evening, Im newbie at unix specially with awk From an scheduler program called Autosys i want to extract some data reading an inputfile that comprises jobs names, then formating the output to columns for example 1. This is the inputfile: $ more MapaRep.txt ds_extra_nikira_usuarios... (18 Replies)
Discussion started by: alexcol
18 Replies

2. Shell Programming and Scripting

Pass awk field to a command line executed within awk

Hi, I am trying to pass awk field to a command line executed within awk (need to convert a timestamp into formatted date). All my attempts failed this far. Here's an example. It works fine with timestamp hard-codded into the command echo "1381653229 something" |awk 'BEGIN{cmd="date -d... (4 Replies)
Discussion started by: tuxer
4 Replies

3. Shell Programming and Scripting

Passing awk variable argument to a script which is being called inside awk

consider the script below sh /opt/hqe/hqapi1-client-5.0.0/bin/hqapi.sh alert list --host=localhost --port=7443 --user=hqadmin --password=hqadmin --secure=true >/tmp/alerts.xml awk -F'' '{for(i=1;i<=NF;i++){ if($i=="Alert id") { if(id!="") if(dt!=""){ cmd="sh someScript.sh... (2 Replies)
Discussion started by: vivek d r
2 Replies

4. Shell Programming and Scripting

HELP with AWK one-liner. Need to employ an If condition inside AWK to check for array variable ?

Hello experts, I'm stuck with this script for three days now. Here's what i need. I need to split a large delimited (,) file into 2 files based on the value present in the last field. Samp: Something.csv bca,adc,asdf,123,12C bca,adc,asdf,123,13C def,adc,asdf,123,12A I need this split... (6 Replies)
Discussion started by: shell_boy23
6 Replies

5. Shell Programming and Scripting

awk command to compare a file with set of files in a directory using 'awk'

Hi, I have a situation to compare one file, say file1.txt with a set of files in directory.The directory contains more than 100 files. To be more precise, the requirement is to compare the first field of file1.txt with the first field in all the files in the directory.The files in the... (10 Replies)
Discussion started by: anandek
10 Replies

6. Shell Programming and Scripting

Comparison and editing of files using awk.(And also a possible bug in awk for loop?)

I have two files which I would like to compare and then manipulate in a way. File1: pictures.txt 1.1 1.3 dance.txt 1.2 1.4 treehouse.txt 1.3 1.5 File2: pictures.txt 1.5 ref2313 1.4 ref2345 1.3 ref5432 1.2 ref4244 dance.txt 1.6 ref2342 1.5 ref2352 1.4 ref0695 1.3 ref5738 1.2... (1 Reply)
Discussion started by: linuxkid
1 Replies

7. 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

8. Shell Programming and Scripting

awk: assign variable with -v didn't work in awk filter

I want to filter 2nd column = 2 using awk $ cat t 1 2 2 4 $ VAR=2 #variable worked in print $ cat t | awk -v ID=$VAR ' { print ID}' 2 2 # but variable didn't work in awk filter $ cat t | awk -v ID=$VAR '$2~/ID/ { print $0}' (2 Replies)
Discussion started by: honglus
2 Replies

9. Shell Programming and Scripting

scripting/awk help : awk sum output is not comming in regular format. Pls advise.

Hi Experts, I am adding a column of numbers with awk , however not getting correct output: # awk '{sum+=$1} END {print sum}' datafile 2.15291e+06 How can I getthe output like : 2152910 Thank you.. # awk '{sum+=$1} END {print sum}' datafile 2.15079e+06 (3 Replies)
Discussion started by: rveri
3 Replies

10. 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
Login or Register to Ask a Question