代码之家  ›  专栏  ›  技术社区  ›  Programmer

用于组合3个文件的shell脚本

  •  0
  • Programmer  · 技术社区  · 6 年前

    我有3个文件有以下数据

    $cat File1.txt
    Apple,May
    Orange,June
    Mango,July
    
    $cat File2.txt
    Apple,Jan
    Grapes,June
    
    $cat File3.txt
    Apple,March
    Mango,Feb
    Banana,Dec
    

    我需要下面的输出文件。

    $Output_file.txt
    Apple,May|Jan|March
    Orange,June
    Mango,July|Feb
    Grapes,June
    Banana,Dec
    

    这里的要求是取出第一列,然后在每个文件的第1列中搜索公共数据,第二列需要用“”分隔。如果没有公共列,则需要在输出文件中打印相同的列。

    我试过将它放入一个while循环中,但是随着文件大小的增加,这需要时间。想要一个使用shell脚本的简单解决方案。

    3 回复  |  直到 6 年前
        1
  •  1
  •   Gautam    6 年前

    这应该有效:

    #!/bin/bash
    for FRUIT in $( cat "$@" | cut -d "," -f 1 | sort | uniq )
    do
        echo -ne "${FRUIT},"
        awk -F "," "\$1 == \"$FRUIT\" {printf(\"%s|\",\$2)}" "$@" | sed 's/.$/\'$'\n/'
    done
    

    运行方式:

    $ ./script.sh File1.txt File2.txt File3.txt
    
        2
  •  1
  •   Charles Duffy    6 年前

    纯本机bash解决方案(不调用外部工具,因此仅受bash本身的性能限制)可能如下所示:

    #!/usr/bin/env bash
    case $BASH_VERSION in ''|[123].*) echo "ERROR: Bash 4 or newer required" >&2; exit 1;; esac
    
    declare -A items=( )
    for file in "$@"; do
      while IFS=, read -r key value; do
        items[$key]+="|$value"
      done <"$file"
    done
    
    for key in "${!items[@]}"; do
      value=${items[$key]}
      printf '%s,%s\n' "$key" "${value#'|'}"
    done
    

    …称为 ./yourscript File1.txt File2.txt File3.txt

        3
  •  1
  •   anubhava    6 年前

    用一个 awk 命令:

    awk 'BEGIN{FS=OFS=","} {a[$1] = a[$1] (a[$1] == "" ? "" : "|") $2}
    END {for (i in a) print i, a[i]}' File{1,2,3}.txt
    

    Orange,June
    Banana,Dec
    Apple,May|Jan|March
    Grapes,June
    Mango,July|Feb
    

    如果希望输出与原始文件中字符串的显示顺序相同,请使用以下命令 锥子 :

    awk 'BEGIN{FS=OFS=","} !($1 in a) {b[++n] = $1}
    {a[$1] = a[$1] (a[$1] == "" ? "" : "|") $2}
    END {for (i=1; i<=n; i++) print b[i], a[b[i]]}' File{1,2,3}.txt
    

    Apple,May|Jan|March
    Orange,June
    Mango,July|Feb
    Grapes,June
    Banana,Dec