Запись AWK в файл на основе количества полей в csv

#bash #shell #awk

#bash #оболочка #awk

Вопрос:

Я хочу выполнить итерацию по файлу csv и отбросить строки при записи в файл, в котором нет всех столбцов в строке.

У меня есть входной файл mtest.csv , подобный этому

 IP@#Process@#Device@#ID
TestIP1@#TestProcess2@#TestDevice1@#TestID1
TestIP2@#TestProcess2@#TestDevice2
TestIP3@#TestProcess3@#TestDevice3@#TestID3
  

Но я пытаюсь записывать только те записи строк, в которых присутствуют все 4 столбца. В выходных данных не должно быть полной строки столбца TestIP2, поскольку в нем 3 столбца.

Пример вывода должен выглядеть следующим образом:

 IP@#Process@#Device@#ID
TestIP1@#TestProcess2@#TestDevice1@#TestID1
TestIP3@#TestProcess3@#TestDevice3@#TestID3
  

Раньше я делал так, чтобы получить все столбцы, но он также записывает строку TestIP2, в которой есть 3 столбца

 awk -F "@#" '{print $1"@#"substr($2,1,50)"@#"substr($3,1,50)"@#"substr($4,1,50)}' mtest.csv >output2.csv
  

Но когда я пытаюсь убедиться, что он записывает в файл, когда присутствуют все 4 столбца, это не работает

 awk -F "@#", 'NF >3 {print $1"@#"substr($2,1,50)"@#"substr($3,1,50)"@#"substr($4,1,50); exit}' mtest.csv >output2.csv
  

Комментарии:

1. То, что вы пытаетесь сделать, вероятно, awk -F "@#" 'NF>3 {print $0}'

Ответ №1:

Вы усложняете ситуацию больше, чем это должно быть. Все, что вам нужно сделать, это установить флажок NF==4 выводить любые записи, содержащие четыре поля. Ваше общее awk выражение будет:

 awk -F'@#' NF==4 < mtest.csv
  

(примечание: по умолчанию используется действие by awk , print поэтому явного print указания не требуется.)

Пример использования / вывода

С вашим примером ввода в mtest.csv вы бы получили:

 $ awk -F'@#' NF==4 < mtest.csv
IP@#Process@#Device@#ID
TestIP1@#TestProcess2@#TestDevice1@#TestID1
TestIP3@#TestProcess3@#TestDevice3@#TestID3
  

Ответ №2:

Спасибо Дэвиду и Вукунгу

Оба ваших решения в порядке.Я хочу записать в файл, чтобы я мог также обрезать длину каждого поля

Я думаю, что это приведенное ниже утверждение работает

 awk -F "@#" 'NF>3 {print $1"@#"substr($2,1,50)"@#"substr($3,1,2)"@#"substr($4,1,3)}'  mtest.csv >output2.csv