【发布时间】:2020-07-07 13:03:55
【问题描述】:
我有以下两个文本文件:
文件1
-7.7
-7.4
-7.3
-7.3
-7.3
文件2
4.823
5.472
5.856
4.770
4.425
我想将它们并排合并,用逗号分隔:
文件3
-7.7,4.823
-7.4,5.472
-7.3,5.856
-7.3,4.770
-7.3,4.425
我知道这可以通过paste -d ',' file1 file2 > file3 轻松完成,但我想要一个允许我控制每次迭代的解决方案,因为我的数据集很大,而且我还需要在输出文件中添加其他列。例如:
A,-7.7,4.823,3
A,-7.4,5.472,2
B,-7.3,5.856,3
A,-7.3,4.770,1
B,-7.3,4.425,1
这是我目前得到的:
awk 'NR==FNR {a[$count]=$1; count+=1; next} {print a[$count] "," $1; count+=1;}' file1 file2 > file3
输出:
-7.3,4.823
-7.3,5.472
-7.3,5.856
-7.3,4.770
-7.3,4.425
我是 bash 和 awk 的新手,因此不胜感激:)
编辑:
假设我有一个包含成对文件的目录,以两个扩展名结尾:.ext1 和 .ext2。这些文件的名称中包含参数,例如 file_0_par1_par2.ext1 有其对 file_0_par1_par2.ext2。每个文件包含 5 个值。我有一个函数可以从它的名称中提取它的序列号和它的参数。我的目标是在单个 csv 文件 (file_out.csv) 上写入文件中存在的值以及从它们的名称中提取的参数。
代码:
for file1 in *.ext1 ; do
for file2 in *.ext2 ; do
# for each file ending with .ext2, verify if it is file1's corresponding pair
# I know this is extremely time inefficient, since it's a O(n^2) operation, but I couldn't find another alternative
if [[ "${file1%.*}" == "${file2%.*}" ]] ; then
# extract file_number, and par1, par2 based on some conditions, then append to the csv file
paste -d ',' "$file1" "$file2" | while IFS="," read -r var1 var2;
do
echo "$par1,$par2,$var1,$var2,$file_number" >> "file_out.csv"
done
fi
done
done
【问题讨论】: