2013-09-08 4 views
1

У меня есть файл с 5 колонками:Использование если/другое заявление, в середине AWK

PS 6 15 0 1 
PS 1 17 0 1 
PS 4 18 0 1 

, что я хотел бы получить его в этом формате 7-колонки:

PS.15 PS 6 N 1 0 1 
PS.17 PS 1 P 1 0 1 
PS.18 PS 4 N 1 0 1 

Для создания 6 из 7 столбцов требуется просто захватить напрямую (а иногда и применять небольшую арифметику) из столбцов в исходном файле. Однако для создания одного столбца (столбец 4) требуется оператор if-else.

В частности, для создания новых столбцов 1, 2, 3, я использую:

cat File | awk '{print $1"."$3"\t"$1"\t"$2}' 

и создавать новые столбцы 5, 6,7, я использую:

cat testFileB | awk '{print $4+$5"\t"$4/($4+$5)"\t"$5/($4+$5)}' 

и для создания новый столбец 4, я использую:

cat testFileB | awk '{if ($2 == 1 || $2 == 2 || $2 == 3) print "P"; else print "N";}' 

Эти три оператора работает нормально независимо друг от друга и получить меня, что я хочу (правильные значения для столбцов все они разделены вкладками). Однако, когда я пытаюсь применить их одновременно (создайте сразу все 7 столбцов), я могу сделать это только с помощью нежелательных новых строк (вместо вкладок) до и после столбца 4 (столбец справки if/else):

например, моя попытка одновременно создавать столбцы 1, 2, 3, 4:

cat File | awk '{print $1"."$3"\t"$1"\t"$2; if ($2 == 1 || $2 == 2 || $2 == 3) print "P"; else print "N";}' 

результатов в нежелательных новых строк перед колонке 4:

PS.15 PS 6 
N 
PS.17 PS 1 
P 
PS.18 PS 4 

Аналогично, моя попытка одновременно создавать столбцы 4, 5, 6, 7:

cat File | awk '{if ($2 == 1 || $2 == 2 || $2 == 3) print "P"; else print "N"; print $4+$5"\t"$4/($4+$5)"\t"$5/($4+$5)}' 

приводит к нежелательным новым линиям после колонки 4:

N 
1 0 1 
P 
1 0 1 
N 
1 0 1 

Есть ли решение, так что я могу создать все 7 столбцов сразу, и есть только вкладки между ними (нет новых линий)?

ответ

2

Если вы не хотите автоматические линии, вы можете использовать только printf вместо print. Я не совсем уверен, если вы хотите, чтобы вкладка разделила N1 или нет, но это достаточно легко настроить;

cat testfile | awk '{printf "%s.%s\t%s\t%s\t",$1,$3,$1,$2; if ($2 == 1 || $2 == 2 || $2 == 3) printf "P"; else printf "N"; print $4+$5"\t"$4/($4+$5)"\t"$5/($4+$5)}' 

PS.15 PS 6 N1 0 1 
PS.17 PS 1 P1 0 1 
PS.18 PS 4 N1 0 1 
+0

Спасибо за вашу помощь! Я был озадачен после поиска: o) – LanneR

+0

Проиграть [бесполезное использование 'cat'] (http://partmaps.org/era/unix/award.html). – tripleee

1

Просто установите OFS (вместо того, чтобы повторять \t по всей линии), а также использовать тройной оператор для печати P или N:

$ awk -v OFS='\t' '{s=$4+$5;print $1"."$3,$1,$2,($2~/^[123]$/?"P":"N"),s,$4/s,$5/s}' file 
PS.15 PS  6  N  1  0  1 
PS.17 PS  1  P  1  0  1 
PS.18 PS  4  N  1  0  1