Копировать один столбец поверх другого в файле с разделителями - PullRequest
1 голос
/ 20 апреля 2010

Например, мне нужно было удалить столбец 25 и заменить его копией столбца 22 в простом csv-файле без встроенных разделителей. Лучшее, что я мог придумать, было неуклюже: <pre> awk -F, '{ for(x=1;x<25;x++){printf("%s,", $x)};printf("%s,",$22);for(x=26;x<59;x++){printf ("%s,", $x)};print $59}' Я бы ожидал что-то вроде <pre> cut -d, -f1-24,23,26-59 работать, но вырезать, кажется, не хочет печатать один и тот же столбец два раза ...

Есть ли более элегантный способ сделать это, используя что-нибудь типичное, доступное в среде оболочки linux?

Ответы [ 3 ]

4 голосов
/ 20 апреля 2010

Просто скажите awk, чтобы заменить поле 25 на поле 22.

awk 'BEGIN{FS=","; OFS=","} {$25=$22; print}' < test.csv
0 голосов
/ 16 апреля 2012

Это может работать для вас:

echo '1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26' |
sed 's/^\(\([^,]*,\)\{21\}\([^,]*,\)\([^,]*,\)\{2\}\)[^,]*,/\1\3/'
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,22,26

или, если вы предпочитаете:

echo '1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26' | 
sed -r 's/^(([^,]*,){21}([^,]*,)([^,]*,){2})[^,]*,/\1\3/'
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,22,26
0 голосов
/ 20 апреля 2010

Это не элегантно, но paste является частью coreutils и должно быть доступно, но для этого потребуется несколько временных файлов:

$ cat test.csv
one,two,three,four,five,six,seven
1,2,3,4,5,6,7
$ cut -d, -f1-5 test.csv > start.txt
$ cut -d, -f3 test.csv> replace.txt
$ cut -d, -f7 test.csv > end.txt
$ paste -d, start.txt replace.txt end.txt
one,two,three,four,five,three,seven
1,2,3,4,5,3,7

Или вы можете пропустить последний временный файл и использоватьстандартный ввод:

$ cut -d, -f7 test.csv | paste -d, start.txt replace.txt -
one,two,three,four,five,three,seven
1,2,3,4,5,3,7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...