Unix how to sort an entire line based on a specific match

I have a file like this

$> cat testfile.txt
abc_xyz_2a      foo
dft_pqr_abc_5c  bar
pqr_ijk_1a      alpha
efg_5b          beta
ijk_pqr_5a      gamma
pqr_ijk_1b      alpha

I want to sort the rows based on the last value of the first column after the last underscore _, for example 1a, 2a, 5a, 5b,5c

So this is my expected result.

pqr_ijk_1a      alpha
pqr_ijk_1b      alpha
abc_xyz_2a      foo
ijk_pqr_5a      gamma
efg_5b          beta
dft_pqr_abc_5c  bar

Can anyone suggest a way to achieve the expected result?

What i tried

I tried to extract the part after the last underline of the first column and sorting, but this will only print those keywords, not the entire row.

$> awk '{print $1}' testfile.txt|rev|awk -F_ '{print $1}'|rev|sort
1a
2a
5a
5b
5c

I suppose there might be a way to hold / mark line numbers somehow and output based on this? I tried some hits and tests using NRawk unsuccessfully.

: ​​ , 1b . .

+4
3

gnu-awk, PROCINFO :

awk 'BEGIN{PROCINFO["sorted_in"] = "@ind_num_asc"} {
   n=split($1, a, "_")
   data[a[n]]=$0
}
END {
   for (i in data)
      print data[i]
}' file

pqr_ijk_1a      alpha
abc_xyz_2a      foo
ijk_pqr_5a      gamma
efg_5b          beta
dft_pqr_abc_5c  bar

awk-sort-cut:

awk '{n=split($1, a, "_"); print $0 "\0" a[n]}' file | sort -t '\0' -k2 | cut -d $'\0' -f1

pqr_ijk_1a      alpha
abc_xyz_2a      foo
ijk_pqr_5a      gamma
efg_5b          beta
dft_pqr_abc_5c  bar
+2

, .

$ cat data
abc_xyz_2a      foo
dft_pqr_abc_5c  bar
pqr_ijk_1a      alpha
efg_5b          beta
ijk_pqr_5a      gamma


$ awk '{print substr($1, length($1)-1, 1), substr($1, length($1)), $1, $2}' data | sort -n -k1,2 | awk '{print $3,$4}'
pqr_ijk_1a alpha
abc_xyz_2a foo
ijk_pqr_5a gamma
efg_5b beta
dft_pqr_abc_5c bar

:

$ awk '{print substr($1, length($1)-1, 1), substr($1, length($1)), $1, $2}' data
2 a abc_xyz_2a foo
5 c dft_pqr_abc_5c bar
1 a pqr_ijk_1a alpha
5 b efg_5b beta
5 a ijk_pqr_5a gamma

$ awk '{print substr($1, length($1)-1, 1), substr($1, length($1)), $1, $2}' data | sort -n -k1,2
1 a pqr_ijk_1a alpha
2 a abc_xyz_2a foo
5 a ijk_pqr_5a gamma
5 b efg_5b beta
5 c dft_pqr_abc_5c bar
+3

, .

 rev   test.txt | sort  -k2 | rev


pqr_ijk_1a      alpha
abc_xyz_2a      foo
ijk_pqr_5a      gamma
efg_5b          beta
dft_pqr_abc_5c  bar
-1

All Articles