#unix #csv #awk
#unix #csv #awk
Вопрос:
Я хочу объединить эти две команды и хочу вызвать одну команду
В первой команде я сохраняю 4-й столбец файла x.csv (разделитель,) в файле z.csv.
awk -F, '{print $4}' x.CSV > z.csv
Во второй команде я хочу узнать уникальное значение первого столбца файла z.csv (разделитель-пробел).
awk -F '{print $1}' z.csv|sort|uniq
Я хочу объединить эти две команды в одну команду, как я могу это сделать?
Ответ №1:
Передача вывода первой во вторую awk
awk
:
awk -F, '{print $4}' x.CSV | awk -F '{print $1}' |sort|uniq
или, как предложил Авинаш Радж,
awk -F, '{print $4}' x.CSV | awk -F '{print $1}' | sort -u
Комментарии:
1. вы могли бы использовать ,
awk -F, '{print $4}' x.CSV | awk -F '{print $1}' |sort -u
2. @AvinashRaj Хорошее предложение. Спасибо.
3. Вам не нужно два
awk
процесса.4. @JonathanLeffler, вы правы. Иногда мне нравится простота кода ценой нескольких циклов процессора 🙂
5. Я думал, что весь смысл вопроса в том, чтобы избежать использования двух разных процессов awk!
Ответ №2:
Предполагая, что содержимое z.csv
действительно требуется, а не просто артефакт того, как вы в настоящее время реализуете свою программу, тогда вы можете использовать:
awk -F, '{ print $4 > "z.csv"
split($4, f, " ")
f4[f[1]] = 1
}
END { for (i in f4) print i }' x.CSV
split
Функция разбивает поле 4 на пробелы, и (ассоциативный) массив f4
записывает значение ключа. Цикл в конце выводит отдельные значения без сортировки. Если вам нужно, чтобы они были отсортированы, вы можете либо использовать awk
встроенные функции сортировки GNU, либо (если у вас нет awk
встроенных функций сортировки) написать свои собственные awk
или передать вывод в sort
.
С помощью GNU awk
вы можете заменить END
блок на:
END { asorti(f4); for (i in f4) print f4[i] }
Если вам не нужен z.csv
файл, то (а) вы могли бы использовать канал в первую очередь, и (б) вы можете просто удалить print $4 > "z.csv"
строку.
Ответ №3:
awk '{split($4,b," "); a[b[1]]=1} END { for( i in a) print i }' FS=, x.CSV
Это не сортирует данные, но неясно, действительно ли вы хотите, чтобы они были отсортированы, или это просто необходимо для получения уникальных записей. Если вы хотите, чтобы он был отсортирован, передайте его в sort
.
Комментарии:
1. Я думаю, вы немного неправильно поняли вопрос; поле 4 разделено пробелом, а не косой чертой. Вы также не печатаете
$4
вz.csv
, но это тоже легко исправить.2. Спасибо, Джонатан, действительно, это обратная косая черта в вопросе. Я предполагаю, что хранение данных в z.csv на самом деле не является желаемым побочным эффектом (аналогично сортировке).
3. Неясно
z.csv
, действительно ли это необходимо или просто побочный эффект. Поскольку можно было бы использовать канал, я склоняюсь к «требуется», но это очень далеко от окончательного.4. Если я не использую ключевое слово sort, я не смогу получить отдельные записи, поэтому я использовал ключевое слово sort… Разделителем в файле x.csv является «,», но 4-й столбец файла x.csv снова разделен «пробелом», поэтому мне нужны только отдельные записи в 1-м столбце 4-го столбца (который разделен пробелом) файла x.csv.