BenPreston
BenPreston

Reputation: 11

How can I show only some words in a line using sed?

I'm trying to use sed to show only the 1st, 2nd, and 8th word in a line.

The problem I have is that the words are random, and the amount of spaces between the words are also random... For example:

QST334   FFR67     HHYT  87UYU HYHL 9876S   NJI QD112    989OPI

Is there a way to get this to output as just the 1st, 2nd, and 8th words:

QST334 FFR67 QD112

Thanks for any advice or hints for the right direction!

Upvotes: 0

Views: 465

Answers (4)

Hakan Baba
Hakan Baba

Reputation: 2035

Use awk

awk '{print $1,$2,$8}' file

In action:

$ echo "QST334 FFR67 HHYT 87UYU HYHL 9876S NJI QD112 989OPI" | awk '{print $1,$2,$8}'
QST334 FFR67 QD112

Upvotes: 1

potong
potong

Reputation: 58468

This might work for you (GNU sed):

sed 's/\s\+/\n/g;s/.*/echo "&"|sed -n "1p;2p;8p"/e;y/\n/ /' file

Convert spaces to newlines. Evaluate each line as a separate file and print only the required lines i.e. fields. Replace remaining newlines with spaces.

Upvotes: 0

Ayman Nedjmeddine
Ayman Nedjmeddine

Reputation: 12749

Another solution is to use the cut command:

cut --delimiter '<delimiter-character>' --fields <field> <file>

Where:

  • '<delimiter-character>'>: is the delimiter on which the string should be parsed.
  • <field>: specifies which column to output, could a single column 1, multiple columns 1,3 or a range of them 1-3.

In action:

cut -d ' ' -f 1-3 /path/to/file

Upvotes: 0

P....
P....

Reputation: 18391

You do not really need to put " " between two columns as mentioned in another answer. By default awk consider single white space as output field separator AKA OFS. so you just need commas between the desired columns.

so following is enough:

awk '{print $1,$2,$8}' file

For Example:

echo "QST334   FFR67     HHYT  87UYU HYHL 9876S   NJI QD112    989OPI" |awk '{print $1,$2,$8}'
QST334 FFR67 QD112

However, if you wish to have some other OFS then you can do as follow:

echo "QST334   FFR67     HHYT  87UYU HYHL 9876S   NJI QD112    989OPI" |awk -v OFS="," '{print $1,$2,$8}'
QST334,FFR67,QD112

Note that this will put a comma between the output columns.

Upvotes: 1

Related Questions