需要合并 2 个具有不同单词列表大小的文件
Need to combine 2 files having different word list size
我需要合并 2 个文件 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),然后(滥用)使用 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
选项命名它,并使输出不以该分隔符开头(以前是 space,现在是逗号), 使用 -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] = [=10=]; next } # save file_1 in array f1
{ f2[++m] = [=10=] } # 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,%s\n", f1[i], f2[j] # output f1[],f2[]
}
' file_1 file_2
例子Use/Output
根据 file_1
和 file_2
中的数据,您将拥有:
$ awk '
> FNR==NR { f1[++n] = [=11=]; next } # save file_1 in array f1
> { f2[++m] = [=11=] } # 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,%s\n", 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 "" ] && printf "error: %s\n" ""
printf "usage: %s file_1 file_2\n" "${0##*/}"
}
## validate filenames provided in first 2 arguments exist and are non-empty
[ -s "" ] || { usage "file not found or empty"; exit 1; }
[ -s "" ] || { usage "file not found or empty"; exit 1; }
readarray -t f1 < "" # read file_1 int array f1
readarray -t f2 < "" # read file_2 int array f2
for i in "${f1[@]}"; do ## loop over f1
for j in "${f2[@]}"; do ## loop over f2
printf "%s,%s\n" "$i" "$j" ## output combined result
done
done
(注意: awk
可能会提供更好的性能)
例子Use/Output
将脚本另存为 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="\r\n" ' # set comma as field separator, CRLF as record separator
NR==FNR && NF>0 {a[++n]=[=10=]; next} # read file2.txt skipping blang lines
NF>0 {for (i=1; i<=n; i++) print [=10=], a[i]} # print line of file1.txt appending the lines of file2.txt
' file2.txt file1.txt
- 它会跳过输入文件中的空白行。
- 它附加 Windows 行结尾考虑用 Excel 打开。
我需要合并 2 个文件 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),然后(滥用)使用 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
选项命名它,并使输出不以该分隔符开头(以前是 space,现在是逗号), 使用 -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] = [=10=]; next } # save file_1 in array f1
{ f2[++m] = [=10=] } # 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,%s\n", f1[i], f2[j] # output f1[],f2[]
}
' file_1 file_2
例子Use/Output
根据 file_1
和 file_2
中的数据,您将拥有:
$ awk '
> FNR==NR { f1[++n] = [=11=]; next } # save file_1 in array f1
> { f2[++m] = [=11=] } # 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,%s\n", 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 "" ] && printf "error: %s\n" ""
printf "usage: %s file_1 file_2\n" "${0##*/}"
}
## validate filenames provided in first 2 arguments exist and are non-empty
[ -s "" ] || { usage "file not found or empty"; exit 1; }
[ -s "" ] || { usage "file not found or empty"; exit 1; }
readarray -t f1 < "" # read file_1 int array f1
readarray -t f2 < "" # read file_2 int array f2
for i in "${f1[@]}"; do ## loop over f1
for j in "${f2[@]}"; do ## loop over f2
printf "%s,%s\n" "$i" "$j" ## output combined result
done
done
(注意: awk
可能会提供更好的性能)
例子Use/Output
将脚本另存为 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="\r\n" ' # set comma as field separator, CRLF as record separator
NR==FNR && NF>0 {a[++n]=[=10=]; next} # read file2.txt skipping blang lines
NF>0 {for (i=1; i<=n; i++) print [=10=], a[i]} # print line of file1.txt appending the lines of file2.txt
' file2.txt file1.txt
- 它会跳过输入文件中的空白行。
- 它附加 Windows 行结尾考虑用 Excel 打开。