Sponsored Content
Top Forums Shell Programming and Scripting AWK exclude first and last record, sort and print Post 302576080 by agama on Wednesday 23rd of November 2011 02:42:11 PM
Old 11-23-2011
Quote:
Originally Posted by vgersh99
Hmmm.... I don't quite follow how it works, but it does.
How sorting only one line at a time ends up sorting the whole list (not including the last line?
Care to explain?
Also, some awk-s have the limit on how many file handlers (in this case "sort" invocations) one can have opened - some awk-s have it set to 9. So if your awk has limit set to 9, and you have more than 9 lines in your file, your awk might bomb out....
It's a bit misleading, but a cool feature of awk....

When the pipe symbol is used awk forks a single process and begins writing to it's stdin or reading from it's stdout depending on where the command and pipe are placed. A more common example is to execute a command and read each record generated:

Code:
function run_it( cmd )
{      while( (cmd|getline)> 0 )   # fork cmd and read from its stdout
        {
           # do something with $0
        }
        close( cmd );
}

As you point out, awk tends to have a limited number of file descriptors available, so it's very important to close them when finished especially in the case of the run_it function that might be called lots of times.

When awk creates the child process, the real FD is mapped using the command string, which is why I tend to put the command into a variable as it's easier to pass it to close, especially if someone comes along and modifies the original command without realising that it needs to be exactly the same in the close.

For the code above, the sort command is forked on the first execution of the statement, and after that awk maps the command string to an already open file descriptor and writes the additional records to the already open FD rather than starting another process. Thus, we get the records we want sorted, and the ones we dont (first and last) are just written to standard output.

This is along the same lines as
Code:
   print foo >"/tmp/file";

Each time the statement is executed the variable contents in foo are printed to the tmp file; the open only happens on the first execution of the statement.

@vgersh99 -- a bit more info than I think you needed, but from the perspective of someone wrestling with the concept of piping a command from inside an awk programme I decided to err on too much.

Last edited by agama; 11-23-2011 at 03:48 PM.. Reason: clarification
This User Gave Thanks to agama For This Post:
 

10 More Discussions You Might Find Interesting

1. UNIX for Dummies Questions & Answers

How to exclude a record from unix file

I want to exclude records from my unix file that have a specific pattern. How can I do this? Thanks. Ryan (1 Reply)
Discussion started by: Ryan2786
1 Replies

2. UNIX for Advanced & Expert Users

Print Full record and substring in that record

I have i got a requirement like below. I have input file which contains following fixed width records. 00000000000088500232007112007111 I need the full record and concatenated with ~ and characters from 1to 5 and concatenated with ~ and charactes from 10 to 15 The out put will be like... (1 Reply)
Discussion started by: ukatru
1 Replies

3. Shell Programming and Scripting

awk - sort, then print the high value for each group

Hi @ all I'm trying to achive to this problem, I've a 2-column composed file as the following: 192.168.1.2 2 192.168.1.3 12 192.168.1.2 4 192.168.1.4 3 cpc1-swan1-2-3-cust123.swan.cable.ntl.com 4 192.168.1.3 5 192.168.1.2 10 192.168.1.4 8... (8 Replies)
Discussion started by: m4rco-
8 Replies

4. Shell Programming and Scripting

awk - print record with both string1 and string2

How do I use awk to find the records in a file that contains two specific strings? I have tried piping and using awk two times, but I don't know how to do it in one action. (2 Replies)
Discussion started by: locoroco
2 Replies

5. Shell Programming and Scripting

Print all the fields of record using awk

Hi, i want to generate print statement using awk. i have 20+ and 30+ fields in each line Now its priting only first eight fields print statement as output not all. my record is as shown below filename ... (2 Replies)
Discussion started by: raghavendra.nsn
2 Replies

6. Shell Programming and Scripting

[AWK script]Counting the character in record and print them in condition

.......... (1 Reply)
Discussion started by: Antonlee
1 Replies

7. Shell Programming and Scripting

AWK print initial record and double

I have an initial record 0.018 I would like a script that would for i=0;i<200;i++ print 0.018*1 0.018*2 0.018*3 0.018*4 ... 0.018*200 using newline. (7 Replies)
Discussion started by: chrisjorg
7 Replies

8. Shell Programming and Scripting

How to compare current record,with next and previous record in awk without using array?

Hi! all can any one tell me how to compare current record of column with next and previous record in awk without using array my case is like this input.txt 0 32 1 26 2 27 3 34 4 26 5 25 6 24 9 23 0 32 1 28 2 15 3 26 4 24 (7 Replies)
Discussion started by: Dona Clara
7 Replies

9. Shell Programming and Scripting

awk to print record not equal specific pattern

how to use "awk" to print any record has pattern not equal ? for example my file has 5 records & I need to get all lines which $1=10 or 20 , $2=10 or 20 and $3 greater than "130302" as it shown : 10 20 1303252348212B030 20 10 1303242348212B030 40 34 1303252348212B030 10 20 ... (14 Replies)
Discussion started by: arm
14 Replies

10. Shell Programming and Scripting

awk print matching records and occurences of each record

Hi all , I have two files : dblp.xml with dblp records and itu1.txt with faculty members records. I need to find out how many dblp records are related to the faculty members. More specific: I need to find out which names from itu1.txt are a match in dblp. xml file , print them and show how many... (4 Replies)
Discussion started by: iori
4 Replies
All times are GMT -4. The time now is 06:25 PM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy