合并具有相同模式的两条线的最佳方法

时间:2015-06-11 03:27:24

标签: shell

我有一个如下文字文件 输入:

  

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 个答案:

答案 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 :(得分: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