Объединение двух команд awk в одну команду

#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.