需要组合两个具有不同单词列表大小的文件



我需要组合bash脚本的两个文件,这些文件具有不同字数的单词列表,我想将它们组合起来,如下所示。

文件1:

word1
word2
word3

文件2:

8.8.8.8
4.4.4.4
4.4.2.2
5.5.5.5

所需输出:

word1,8.8.8.8
word1,4.4.4.4
word1,4.4.2.2
word1,5.5.5.5
word2,8.8.8.8
word2,4.4.4.4
word2,4.4.2.2
word2,5.5.5.5
word3,8.8.8.8
word3,4.4.4.4
word3,4.4.2.2
word3,5.5.5.5

找到文件中未包含的足够高的字段号(如100(,然后(ab(使用join生成笛卡尔乘积

join -j 100 file1.txt file2.txt
word1 8.8.8.8
word1 4.4.4.4
word1 4.4.2.2
word1 5.5.5.5
word2 8.8.8.8
word2 4.4.4.4
word2 4.4.2.2
word2 5.5.5.5
word3 8.8.8.8
word3 4.4.4.4
word3 4.4.2.2
word3 5.5.5.5

编辑:为了有一个逗号作为列分隔符,请使用-t选项命名它,并使输出不以该分隔符(以前是空格,现在是逗号(开头,使用-o选项显式排序:

join -j 100 -t, -o 1.1,2.1 file1.txt file2.txt
word1,8.8.8.8
word1,4.4.4.4
word1,4.4.2.2
word1,5.5.5.5
word2,8.8.8.8
word2,4.4.4.4
word2,4.4.2.2
word2,5.5.5.5
word3,8.8.8.8
word3,4.4.4.4
word3,4.4.2.2
word3,5.5.5.5

您可以使用awk将两个文件的值读取到单独的索引数组中,然后在END规则中,简单地循环以您想要的格式输出的存储值,例如,从而简化并获得灵活性

awk '
FNR==NR { f1[++n] = $0; next }        # save file_1 in array f1
{ f2[++m] = $0 }                      # save file_2 in array f2
END {
for (i=1; i<=n; i++)                # loop over all f1 values
for(j=1; j<=m; j++)               # loop over all f2 values
printf "%s,%sn", f1[i], f2[j]  # output f1[],f2[]
}
' file_1 file_2

示例使用/输出

如果你的数据在file_1file_2中,你会有:

$ awk '
>   FNR==NR { f1[++n] = $0; next }        # save file_1 in array f1
>   { f2[++m] = $0 }                      # save file_2 in array f2
>   END {
>     for (i=1; i<=n; i++)                # loop over all f1 values
>       for(j=1; j<=m; j++)               # loop over all f2 values
>         printf "%s,%sn", f1[i], f2[j]  # output f1[],f2[]
>   }
> ' file_1 file_2
word1,8.8.8.8
word1,4.4.4.4
word1,4.4.2.2
word1,5.5.5.5
word2,8.8.8.8
word2,4.4.4.4
word2,4.4.2.2
word2,5.5.5.5
word3,8.8.8.8
word3,4.4.4.4
word3,4.4.2.2
word3,5.5.5.5

使用Bash

您可以在bash脚本中使用readarray(mapfile的同义词(将两个文件读取到数组中,例如,执行完全相同的操作

#!/bin/bash
usage() {  ## simple function to output error and usage
[ -n "$1" ] && printf "error: %sn" "$1"
printf "usage: %s file_1 file_2n" "${0##*/}"
}
## validate filenames provided in first 2 arguments exist and are non-empty
[ -s "$1" ] || { usage "file $1 not found or empty"; exit 1; }
[ -s "$2" ] || { usage "file $2 not found or empty"; exit 1; }
readarray -t f1 < "$1"    # read file_1 int array f1
readarray -t f2 < "$2"    # read file_2 int array f2
for i in "${f1[@]}"; do         ## loop over f1
for j in "${f2[@]}"; do       ## loop over f2
printf "%s,%sn" "$i" "$j"  ## output combined result
done
done

(注意:awk可能会提供更好的性能(

示例使用/输出

将脚本保存为cmbfiles.sh后,您将获得:

$ bash cmbfiles.sh file_1 file_2
word1,8.8.8.8
word1,4.4.4.4
word1,4.4.2.2
word1,5.5.5.5
word2,8.8.8.8
word2,4.4.4.4
word2,4.4.2.2
word2,5.5.5.5
word3,8.8.8.8
word3,4.4.4.4
word3,4.4.2.2
word3,5.5.5.5

请尝试以下操作:

awk -v OFS="," -v ORS="rn" '                  # set comma as field separator, CRLF as record separator
NR==FNR && NF>0 {a[++n]=$0; next}           # read file2.txt skipping blang lines
NF>0 {for (i=1; i<=n; i++) print $0, a[i]}  # print line of file1.txt appending the lines of file2.txt
' file2.txt file1.txt
  • 它跳过输入文件中的空行
  • 它会附加考虑使用Excel打开的Windows行尾

相关内容

  • 没有找到相关文章

最新更新