Hi everyone,
I've really searched for a solution to this and this is what I found so far:
I need to sort a command output (here represented as a "cat file" command) and from the second down to the second-last line based on the second row and then print ALL the output with the specified section sorted. Almost done, BUT:
input:
For the moment I have this:
Assigning to the Num variable the code cat test | wc -l;
I would like to include the last line to have this:
But trying
I have this, with the last row jumping to the second row:
Also using not a reverse sort with just sort -k2n.
I hope it's clear and not too long.
Thanks in advance!
You're seeing the last line come out at top because you're not closing the pipe to the sort command and thus your print is happening before sort finishes and prints it's output. Here's my solution, which also doesn't require knowing the number of records between before hand:
You're seeing the last line come out at top because you're not closing the pipe to the sort command and thus your print is happening before sort finishes and prints it's output. Here's my solution, which also doesn't require knowing the number of records between before hand:
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....
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:
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
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
Just to add a reference to the relevant part of the manual:
Quote:
print items | command
It is possible to send output to another program through a pipe instead of into a file.
This redirection opens a pipe to command, and writes the values of items through this pipe to another process created to execute command.
The redirection argument command is actually an awk expression. Its value is converted to a string whose contents give the shell command
to be run.
For example, the following produces two files, one unsorted list of BBS names,
and one list sorted in reverse alphabetical order:
So, as already stated, it's like:
These 2 Users Gave Thanks to radoulov For This Post:
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)
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)
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)
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)
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)
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)
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)
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)