Как получить только нечетные записи из файла с помощью команды awk в файле с разделителями канала? - PullRequest
0 голосов
/ 28 февраля 2019

Требуется выбрать только нечетные столбцы из файла с разделителем каналов.

SOURCE_FILE
1|ABC|WORK|1234
2|DEF|OFFICE|5678
3|GHI|HOME|9012
4|JKL|PERSONAL|3456

ОЖИДАЕМЫЙ ВЫХОД

1|WORK
2|OFFICE
3|HOME
4|PERSONAL

Я пытаюсь использовать awk -F'|' '{ for (i=1;i<=NF;i+=2) $i="" } 1' OFS="|" New2.txt >> delimt.txt, но он удаляет значения ине позиция.

Ответы [ 3 ]

0 голосов
/ 28 февраля 2019

Другой awk

 awk -F"|" -v OFS="|" ' { for(i=1;i<NF;i+=2) { printf("%s%s",s,$i);s="|"; } print "";s=""  } '

с заданными входами

$ cat praveen.txt
1|ABC|WORK|1234
2|DEF|OFFICE|5678
3|GHI|HOME|9012
4|JKL|PERSONAL|3456

$ awk -F"|" -v OFS="|" ' { for(i=1;i<NF;i+=2) { printf("%s%s",s,$i);s="|"; } print "";s=""  } ' praveen.txt
1|WORK
2|OFFICE
3|HOME
4|PERSONAL

$
0 голосов
/ 28 февраля 2019

Вы можете сделать это и с coreutils:

cols=$(head -n1 infile | tr '|' '\n' | wc -l)
cut -d'|' -f$(seq -s, 1 2 $cols) infile

Вывод:

1|WORK
2|OFFICE
3|HOME
4|PERSONAL
0 голосов
/ 28 февраля 2019

1-е решение: Не могли бы вы попробовать следующее.

 awk 'BEGIN{FS=OFS="|"} {for(i=1;i<=NF;i+=2){val=(val?val OFS:"") $i};print val;val=""}' Input_file


2-е решение: Без использования переменной и должно быть быстрее, чем 1-е решение, попробуйте следующее.

awk 'BEGIN{FS=OFS="|"} {for(i=1;i<=NF;i+=2){printf("%s%s",$i,(i==NF ||i==(NF-1)) && i%2!=0?ORS:OFS)}}' Input_file

ИЛИ (добавление формы не одного вкладыша вышеуказанного решения):

awk '
BEGIN{
  FS=OFS="|"
}
{
  for(i=1;i<=NF;i+=2){
    printf("%s%s",$i,(i==NF || i==(NF-1)) && i%2!=0?ORS:OFS)
  }
}
'   Input_file

Выводбудет выглядеть следующим образом.

1|WORK
2|OFFICE
3|HOME
4|PERSONAL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...