Краткий ответ: вам нужно сначала исправить исходный ввод, он изначально был непоследовательным, что вызвало проблемы позже, когда вы попытаетесь запустить команды.
Вот подробности того, как это исправить:
Во-первых, давайте посмотрим на проблему. Например, если мы скопируем то, что вы разместили, и сохраним это как original_file.tsv
:
35 EAST 23rd Street SOUTH AFRICA 5 600 5000000 6
83 NORTH YELLOWLIGHT AVENUE SOUTH AFRICA 4 700 7000000 5
777 NEW AVENUE SAUDIA 2 900 5000000 3
FIVE VISA ROAD MEXICO 3 300 500000 7
450 JACKSON BLVD USA 3 1500 300000 4
25 QUEENS ROAD SOUTH SOUTH AFRICA 1 900 400000 3
На первый взгляд это выглядит аккуратно и правильно. К сожалению, когда мы более подробно рассмотрим, используя cat -A
, вот так, вы увидите в командной строке:
$ cat -A original_file.tsv
35 EAST 23rd Street^I^ISOUTH AFRICA^I^I5^I600^I5000000^I^I6 $
83 NORTH YELLOWLIGHT AVENUE^ISOUTH AFRICA^I4^I700^I7000000^I^I5 $
777 NEW AVENUE^ISAUDIA^I^I2^I900^I5000000^I^I3 $
FIVE VISA ROAD^I^IMEXICO^I^I3^I300^I500000^I^I7 $
450 JACKSON BLVD^I^IUSA^I^I3^I1500^I300000^I^I4 $
25 QUEENS ROAD SOUTH^I^ISOUTH AFRICA^I^I1^I900^I400000^I^I3$
^ I
означает «здесь есть вкладка» $
означает «это конец этой строки» Это сразу выявляет несоответствия, например:
35 EAST 23rd Street
tab tab ЮЖНАЯ АФРИКА
... 83 NORTH YELLOWLIGHT AVENUE
tab SOUTH AFRICA
...В одной строке есть две вкладки, разделяющие поле 1 и поле 2, в следующей строке только одна вкладка. Это не то же самое в каждой строке.
Но вы не можете правильно отсортировать
данные здесь, когда каждая строка настолько отличается, если в каждой строке имеется несовместимое расположение разделителей или разделителей.
Похоже, что единственная проблема, по крайней мере, с учетом этого примера, - это появление двойных вкладок, хотя на самом деле это должна быть одна вкладка. Поэтому вместо ручного редактирования, чтобы очистить это, мы всегда должны пытаться использовать инструменты, где это возможно. Здесь мы можем использовать sed
, чтобы очистить его и сохранить результаты в файл, например, мы можем вызвать результаты clean_file.tsv
:
$ sed 's/\t\t/\t/g;s/ $//g' original_file.tsv > clean_file.tsv
s / \ t \ t / \ t / g
ищет две вкладки и заменяет их одной ;
, чтобы разделить несколько команд в аргументе sed s / $ // g
, потому что кажется, что там конечный пробел на каком-то конце строк, так что здесь это удаляет его >
перенаправление файла для сохранения вывода sed
в файл, который мы называем clean_file.tsv
clean_file.tsv
выглядит так:
35 EAST 23rd Street SOUTH AFRICA 5 600 5000000 6
83 NORTH YELLOWLIGHT AVENUE SOUTH AFRICA 4 700 7000000 5
777 NEW AVENUE SAUDIA 2 900 5000000 3
FIVE VISA ROAD MEXICO 3 300 500000 7
450 JACKSON BLVD USA 3 1500 300000 4
25 QUEENS ROAD SOUTH SOUTH AFRICA 1 900 400000 3
Мы можем дважды проверить его согласованность, снова используя cat -A
, но теперь на нашем clean_file.tsv
:
35 EAST 23rd Street^ISOUTH AFRICA^I5^I600^I5000000^I6$
83 NORTH YELLOWLIGHT AVENUE^ISOUTH AFRICA^I4^I700^I7000000^I5$
777 NEW AVENUE^ISAUDIA^I2^I900^I5000000^I3$
FIVE VISA ROAD^IMEXICO^I3^I300^I500000^I7$
450 JACKSON BLVD^IUSA^I3^I1500^I300000^I4$
25 QUEENS ROAD SOUTH^ISOUTH AFRICA^I1^I900^I400000^I3$
Мы действительно видим, что все теперь согласовано, если бы мы тщательно их подсчитали, теперь в каждой строке такое же количество полей (здесь 6) и такое же количество табуляций (здесь 5), что и разделители полей или разделители полей.
Теперь, когда у нас есть clean_file.tsv
является входом, который правильно отформатирован, теперь мы можем запустить команду и увидеть:
$ awk '/SOUTH AFRICA/ {print }' clean_file.tsv | sort -t $'\t' -k5,5n
25 QUEENS ROAD SOUTH SOUTH AFRICA 1 900 400000 3
35 EAST 23rd Street SOUTH AFRICA 5 600 5000000 6
83 NORTH YELLOWLIGHT AVENUE SOUTH AFRICA 4 700 7000000 5
-F
удален по сравнению с вашими исходными командами, потому что -F
] предназначен для указания разделителя полей, здесь не требуется, поскольку awk
не выполняет никаких манипуляций с полями и используется здесь только для печати строк, соответствующих ЮЖНАЯ АФРИКА
в них - t $ '\ t'
задает разделитель полей табуляцией. -k5,5
для сортировки от столбца 5 к столбцу 5, потому что в этом случае вы хотели предпоследний, а столбец 5 здесь предпоследний в этом образце данных с 6 столбцами n
означает числовую сортировку. Поскольку по умолчанию используется возрастающий порядок, нам не нужно ничего указывать. Итак, очистив исходные данные и запустив эти awk
и sort
, теперь вы сможете найти записи SOUTH AFRICA
и отсортировать их по пятое поле по возрастанию.
Я вижу два варианта,
root
был разбит на множество возможностей, если служба написана хорошо (, не обязательно -пытается обеспечить безопасность, но позволяет ядру делать это ), тогда она должна работать с возможностями. См. Каковы различные способы установки прав доступа к файлам и т. д. в gnu/linux для получения списка способов, которыми современные Linux делают разрешения.