2015-06-11 3 views
1

У меня есть текстовый файл, как показано ниже Input:Лучший способ объединить две строки с одинаковым рисунком

05-29-2015,03: 15: 00, SESM1_0, ABC, interSesm, REDIRECTED_CALLS, 0

05-29-2015,03: 15: 00, SESM1_0, ABC, interSesm, CALLS_TREATED, 0

Мне интересно, что лучший способ объединить две строки в:

05-29-2015,03: 15: 00, SESM1_0, ABC, interSesm, REDIRECTED_CALLS, 0, CALLS_TREATED, 0

ответ

2

При этом в качестве входного файла:

$ cat file 
05-29-2015,03:15:00,SESM1_0,ABC,interSesm,REDIRECTED_CALLS,0 
05-29-2015,03:15:00,SESM1_0,ABC,interSesm,CALLS_TREATED,0 

Мы можем получить вы хотите:

$ awk -F, -v OFS=, 'NR==1{first=$0;next;} {print first,$6,$7;}' file 
05-29-2015,03:15:00,SESM1_0,ABC,interSesm,REDIRECTED_CALLS,0,CALLS_TREATED,0 
1

Это более общее решение, которое считывает оба файла, по элементам, где элементы разделяются запятой. После первого несоответствия оставшиеся элементы из первой строки добавляются к выходу, а затем остальные позиции из второй строки.

Самый сложный инструмент, который использует это sed. Глядя на него снова, даже sed можно заменить.

#!/bin/bash 
inFile="$1" 
tmp=$(mktemp -d) 
sed -n '1p' <"$inFile" | tr "," "\n" > "$tmp/in1" 
sed -n '2p' <"$inFile" | tr "," "\n" > "$tmp/in2" 
{ while true; do 
    read -r f1 <&3; r1=$? 
    read -r f2 <&4; r2=$? 
    [ $r1 -ne 0 ] || [ $r2 -ne 0 ] && break 
    [ $r1 -ne 0 ] && echo "$f2" 
    [ $r2 -ne 0 ] && echo "$f1" 
    if [ "$f1" == "$f2" ]; then 
    echo "$f1" 
    else 
    while echo "$f1"; do 
     read -r f1 <&3 || break 
    done 
    while echo "$f2"; do 
     read -r f2 <&4 || break 
    done 
    fi 
done; } 3<"$tmp/in1" 4<"$tmp/in2" | tr '\n' ',' | sed 's/.$/\n/' 
rm -rf "$tmp" 

Предположим, что ваш входной файл выглядит следующим образом:

$ cat in.txt 
05-29-2015,03:15:00,SESM1_0,ABC,interSesm,REDIRECTED_CALLS,0 
05-29-2015,03:15:00,SESM1_0,ABC,interSesm,CALLS_TREATED,0 

Вы можете запустить скрипт как:

$ ./merge.sh in.txt 
05-29-2015,03:15:00,SESM1_0,ABC,interSesm,REDIRECTED_CALLS,0,CALLS_TREATED,0 
Смежные вопросы