#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