To find and display the middle line in a file using single line command.


 
Thread Tools Search this Thread
Top Forums UNIX for Dummies Questions & Answers To find and display the middle line in a file using single line command.
# 1  
Old 06-23-2014
To find and display the middle line in a file using single line command.

Hi all,

How can i display the middle line of a file using a single line command?
# 2  
Old 06-23-2014
Code:
awk '{a[b++]=$0;}END{print a[int(b/2)];}' infile

This User Gave Thanks to in2nix4life For This Post:
# 3  
Old 06-23-2014
Can you please explain this part "{a[b++]=$0;}" of the code.
Im new to Unix.
# 4  
Old 06-23-2014
The b variable, incrementing on every line, is identical with awk's NR variable.
So one can shorten it to
Code:
awk '{a[NR]=$0;} END {print a[int(NR/2)]}' infile

a is an array that stores each line.
So the file must fit into memory!
At the END, the middle array element is printed.
Another approach, slower but saving memory is
Code:
awk 'int((NR-FNR)/2)==FNR {print; exit}' infile infile

also using another awk variable FNR, but needs to read infile twice.
The difference between NR and FNR might become clear with the following test
Code:
awk '{print "NR="NR, "FNR="FNR, $0}' infile infile

And by looking at it, or by applying school mathematics one can optimize to
Code:
awk 'NR==FNR*3 {print; exit}' infile infile

Smilie

Last edited by MadeInGermany; 06-23-2014 at 02:25 PM.. Reason: optimized
This User Gave Thanks to MadeInGermany For This Post:
# 5  
Old 06-23-2014
Quote:
Originally Posted by MadeInGermany
The b variable, incrementing on every line, is identical with awk's NR variable.
So one can shorten it to
Code:
awk '{a[NR]=$0;} END {print a[int(NR/2)]}' infile

a is an array that stores each line.
So the file must fit into memory!
At the END, the middle array element is printed.
Another approach, slower but saving memory is
Code:
awk 'int((NR-FNR)/2)==FNR {print; exit}' infile infile

also using another awk variable FNR, but needs to read infile twice.
The difference between NR and FNR might become clear with the following test
Code:
awk '{print "NR="NR, "FNR="FNR, $0}' infile infile

And by looking at it, or by applying school mathematics one can optimize to
Code:
awk 'NR==FNR*3 {print; exit}' infile infile

Smilie
Unfortunately, if infile contains an odd number of lines (3 for example), none of these will work.
In the 1st awk script int(3/2) is 1, not 2; so that script prints the 1st line instead of the 2nd (middle) line in the file.
And, in the 2nd awk script, the line to be printed from the file reading it the 2nd time would have NR == 5 and FNR == 2, but NR (5) != FNR*3 (6).

A corrected version of the 1st script should work (as long as the file fits in memory):
Code:
awk '{a[NR]=$0} END {print a[int((NR+1)/2)]}' infile

The simplest working code I came up with reading the file about 1.5 times is:
Code:
awk '
FNR == 1 && NR != 1 {x = int(NR/2)}
FNR == x {print;exit}
' infile infile

This User Gave Thanks to Don Cragun For This Post:
# 6  
Old 06-24-2014
Thanks for the finding.
Then, for esthetic reasons, I prefer
Code:
awk '(FNR==1) {x=int(NR/2)} (FNR==x) {print; exit}' infile infile

These 2 Users Gave Thanks to MadeInGermany For This Post:
# 7  
Old 06-27-2014
Thank you soo much @MadeInGermany and @Don Cragun.
 
Login or Register to Ask a Question

Previous Thread | Next Thread

9 More Discussions You Might Find Interesting

1. Homework & Coursework Questions

How to display certain line of file only using head or tail in 1 command?

First month learning about the Linux terminal and it has been a challenge yet fun so far. We're learning by using a gameshell. I'm trying to display a certain line ( only allowed 1 command ) from a file only using the head or tail. I'm pretty about this answer: head -23 history.txt | tail -1... (1 Reply)
Discussion started by: forzatekk
1 Replies

2. UNIX for Beginners Questions & Answers

Output to file print as single line, not separate line

example of problem: when I echo "$e" >> /home/cogiz/file.txt result prints to file as:AA BB CC I need it to save to file as this:AA BB CC I know it's probably something really simple but any help would be greatly appreciated. Thank You. Cogiz (7 Replies)
Discussion started by: cogiz
7 Replies

3. Shell Programming and Scripting

sed command to grep multiple pattern present in single line and delete that line

here is what i want to achieve.. i have a file with below contents cat fileName blah blah blah . .DROP this REJECT that . --sport 7800 -j REJECT --reject-with icmp-port-unreachable --dport 7800 -j REJECT --reject-with icmp-port-unreachable . . . more blah blah blah --dport 3306... (14 Replies)
Discussion started by: vivek d r
14 Replies

4. UNIX for Dummies Questions & Answers

vim copy line and paste at the beginning, middle, and end of another line

How would you do vim copy line and paste at the beginning, middle, and end of another line. I know yy copies the whole line and p pastes the whole line, but on its own separate line. Sometimes I would like to copy a line to the beginning, middle, or end of another line. I would think this would be... (3 Replies)
Discussion started by: cokedude
3 Replies

5. UNIX for Dummies Questions & Answers

single line command to delete a 6 months old file

i had this scenario where i need to delete a file that is 6 months old which is no longer needed. basically the filename is in the format of PCARDDAILYmmddyyyy.txt where the mm is the month, dd is the day, and yyyy is the year. e.g. PCARDDAILY05262009.txt PCARDDAILY05252009.txt ... (6 Replies)
Discussion started by: wtolentino
6 Replies

6. Shell Programming and Scripting

Need a Command To display "echo command value in loop" in single line.

Hi I want to display "echo command value in loop" in single line. My requirement is to show the input file (test_1.txt) like the output file (test_2.txt) given below. Input file :test_1.txt a1|b1|4|5 a1|b1|42|9 a2|b2|32|25 a1|b1|2|5 a3|b3|4|8 a2|b2|14|6 Output file:test_2.txt... (2 Replies)
Discussion started by: sakthifire
2 Replies

7. Shell Programming and Scripting

Display mutiple line in single line

Hi All, I had a file called Input.txt, i need to group up in a single line as 1=ttt and the no of lines may vary bewteen the 1=ttt cat Input.txt 1=ttt,2=xxxxxx, 3=4545 44545, 4=66667 7777, 5=77723 1=ttt, 2=xxxxxx, 3=34436 66 3545, 4=66666, 5=ffffff, 6=uuuuuuu 1=ttt, 2=xxxxxx,... (4 Replies)
Discussion started by: manosubsulo
4 Replies

8. Shell Programming and Scripting

Script to add a single line to middle of text file.

I've got a configuration file that is filled with xml text statements for example: <...../> <...../> <...../> <data id="java-options" value="-server -Djava.security.policy..../> <...../> <...../> <...../> I want to write a korn shell script that will go to this specific line and add a... (2 Replies)
Discussion started by: progkcp
2 Replies

9. Shell Programming and Scripting

Single line file editing command?

Hello everyone. I have been reading a lot about the various different text editors at my disposal through Unix, but I just can't seem to close the deal for what I am trying to do. Is there a way to issue a single line command to edit a file where pattern=x, and do it non-destructively AND in-place?... (1 Reply)
Discussion started by: gator76
1 Replies
Login or Register to Ask a Question