Linux Shell脚本:去除重复标识并重新格式化paste命令输出
处理paste合并后的数据去重并格式化表格
在Linux Shell环境中,使用paste file1 file2合并两个文件后,得到了包含重复标识的输出,需要编写脚本去除重复标识,并将输出转换为指定的结构化表格。
原合并输出
$ paste file1 file2 TRADE_DATE:12 Jul 2023 TRADE_DATE:13 Jul 2023 Symbol: AMAZON Symbol: AMAZON Price: 100.50 Price: 100.30 Symbol: TESLA Symbol: TESLA Price: 60.80 Price: 60.50
期望输出
TRADE_DATE Symbol Price 12 Jul 2023 AMAZON 100.50 12 Jul 2023 TESLA 60.80 13 Jul 2023 AMAZON 100.30 13 Jul 2023 TESLA 60.50
解决方案脚本
用awk可以高效处理这类结构化文本,脚本如下:
paste file1 file2 | awk ' BEGIN { # 打印对齐的表头 printf "%-13s %-10s %-8s\n", "TRADE_DATE", "Symbol", "Price" count = 0 } # 提取左右两个交易日 /TRADE_DATE/ { split($0, parts, /TRADE_DATE:/) date_left = parts[2] gsub(/^[[:space:]]+|[[:space:]]+$/, "", date_left) date_right = parts[3] gsub(/^[[:space:]]+|[[:space:]]+$/, "", date_right) next } # 提取左右两边的股票代码,存入数组 /Symbol/ { split($0, parts, /Symbol:/) sym_left[++count] = parts[2] gsub(/^[[:space:]]+|[[:space:]]+$/, "", sym_left[count]) sym_right[count] = parts[3] gsub(/^[[:space:]]+|[[:space:]]+$/, "", sym_right[count]) next } # 提取价格并输出左交易日对应的数据 /Price/ { split($0, parts, /Price:/) price_left[count] = parts[2] gsub(/^[[:space:]]+|[[:space:]]+$/, "", price_left[count]) price_right[count] = parts[3] gsub(/^[[:space:]]+|[[:space:]]+$/, "", price_right[count]) printf "%-13s %-10s %-8s\n", date_left, sym_left[count], price_left[count] } # 输出右交易日对应的数据 END { for (i=1; i<=count; i++) { printf "%-13s %-10s %-8s\n", date_right, sym_right[i], price_right[i] } } '
脚本说明
- BEGIN块:先打印格式化后的表头,通过
%-Ns格式符固定每列宽度,实现对齐效果。 - TRADE_DATE行处理:拆分字符串提取左右两个日期,用
gsub去除日期前后的多余空格。 - Symbol行处理:拆分提取左右股票代码,存入对应数组,同时用计数器记录股票数量。
- Price行处理:拆分提取左右价格,立即输出左交易日对应的股票代码和价格。
- END块:遍历数组,输出右交易日对应的所有股票代码和价格。
内容的提问来源于stack exchange,提问作者user13740263
相关产品推荐
相关产品推荐

