2014-12-02 5 views
0

Я пытаюсь выполнить разные команды для обработки файла csv, где разделителем является символ |.Использование символа трубы в качестве разделителя полей

Хотя эти команды работают, когда запятая является разделителем, он выдает ошибку, когда я заменить его с трубой:

awk -F[|] "NR==FNR{a[$2]=$0;next}$2 in a{ print a[$2] [|] $4 [|] $5 }" OFS=[|] file1.csv file2.csv 

awk "{print NR "|" $0}" file1.csv 

Я пытался, "|", [|], /| безрезультатно.

Я использую Gawk на окнах. Что мне не хватает?

+2

Вы пробовали '\ |' как в, например, 'awk -F \ | '{print NF}' bar.txt'? – jas

+0

Как выглядят ваши данные? Какая ошибка? –

+0

проблема в 'print'. Просто используйте запятые для разделения полей, как я указываю в своем ответе. – fedorqui

ответ

1

Вы пробовали "|", [|] и /|. /| не работает, потому что escape-символ - \, тогда как [] используется для определения диапазона полей, например [,-], если вы хотите, чтобы FS был либо ,, либо -.

Чтобы сделать работу "|" в порядке, вы уверены, что используете ее именно так? Alternativelly, денешься ->\|:

$ echo "he|llo|how are|you" | awk -F"|" '{print $1}' 
he 
$ echo "he|llo|how are|you" | awk -F\| '{print $1}' 
he 
$ echo "he|llo|how are|you" | awk 'BEGIN{FS="|"} {print $1}' 
he 

Но обратите внимание, что, когда вы говорите:

print a[$2] [|] $4 [|] $5 

так что вы не используете никакие ограничители на всех. Как вы уже определили OFS, сделайте следующее:

print a[$2], $4, $5 

Пример:

$ cat a 
he|llo|how are|you 
$ awk 'BEGIN {FS=OFS="|"} {print $1, $3}' a 
he|how are 
1

Try, чтобы избежать |

echo "more|data" | awk -F\| '{print $1}' 
more 
1

Вы можете избежать | в \|

$ cat test 
hello|world 
$ awk -F\| '{print $1, $2}' test 
hello world 
Смежные вопросы