jnmf
jnmf

Reputation: 137

can't make pipe operator function properly - linux

I'm trying to get the second column of a file, get the first 10 results and sort it in alphanumerical order but it doesn't seem to work.

cut -f2 file.txt | head -10 | sort -d

I get this output:

NM_000242
NM_000525
NM_001005850
NM_001136557
NM_001204426
NM_001204836
NM_001271762
NM_001287216
NM_006952
NM_007253

If I sort the file first and get the first 10 lines of the sorted file it works

cut -f2 refGene.txt | sort -d | head -10

I get this output:

NM_000014
NM_000015
NM_000016
NM_000017
NM_000018
NM_000019
NM_000020
NM_000021
NM_000022
NM_000023

I don't want to sort the file and get the sorted result, I'd like to get the first 10 lines first and then sort them in alphanumerical order. What did I miss here? Thanks

Upvotes: 0

Views: 113

Answers (1)

Krzysztof Krasoń
Krzysztof Krasoń

Reputation: 27486

Well, it works correctly NM_000525 is before NM_001005850, and the later is before NM_00695.

But if you need to sort the second part (after the _) numerically, then you can do:

cut -f2 file.txt | head -10 | sort -t_ -k1,1 | sort -s -t_ -k2 -n
  • -s is a stable sort

Assuming the format is the same in the whole file (two letters _ numbers)

EDIT: Even shorter version would be:

cut -f2 file.txt | head -10 | sort -t_ -k1,1 -k2n

Explanation:

  • -t_ use _ as separator of fields (for selection on which field to sort)
  • -k1,1 sort alphabetically from first field (without ,1 it would sort also the second field)
  • -k2n sort numerically on the second field

So first it will sort by first field (using alphanumeric sorting) and then using the second field (using numeric, so it will convert string to a number and sort that)

Upvotes: 1

Related Questions