bash-读取一行,使用sed/awk拆分元组
我有以下格式的每行文本数据:bash-读取一行,使用sed/awk拆分元组,bash,awk,sed,Bash,Awk,Sed,我有以下格式的每行文本数据: 6,(2, 4, 5),(239, 153, 679) 5,(4, 5, 7),(534, 627, 902) 1,(4, 5, 6),(523, 697, 679) 3,(1, 4, 5),(942, 583, 767) 2,(3, 4, 5, 7),(239, 531, 867, 412) 4,(4, 5, 6),(253, 167, 1479) 我想阅读每一行,在进一步处理之前分成3个子字符串。例如,处理第1行应产生以下3个字符串: substring 1
6,(2, 4, 5),(239, 153, 679)
5,(4, 5, 7),(534, 627, 902)
1,(4, 5, 6),(523, 697, 679)
3,(1, 4, 5),(942, 583, 767)
2,(3, 4, 5, 7),(239, 531, 867, 412)
4,(4, 5, 6),(253, 167, 1479)
我想阅读每一行,在进一步处理之前分成3个子字符串。例如,处理第1行应产生以下3个字符串:
substring 1 - "6"
substring 2 - "2,4,5" [preferably array, but I guess I can convert string to array]<br>
substring 3 - "239, 153, 67" [same as above]
子串1-“6”
子字符串2-“2,4,5”[最好是数组,但我想我可以将字符串转换为数组]
子串3-“239、153、67”[同上]
有人能帮忙吗?sed和awk语法在这一点上对我来说似乎有点复杂。使用
sed
:
sed -r 's/(.*),\((.*)\),\((.*)\)/\1\n\2\n\3/g' file.txt
纯bash
解决方案:
#!/bin/bash
regex="^(.*),\((.*)\),\((.*)\)$"
while read line
do
if [[ $line =~ $regex ]]
then
echo "substring 1 - ${BASH_REMATCH[1]}"
echo "substring 2 - ${BASH_REMATCH[2]}"
echo "substring 3 - ${BASH_REMATCH[3]}"
fi
done < file.txt
#/bin/bash
regex=“^(.*),\(.*),\(.*)$”
读行时
做
如果[$line=~$regex]]
然后
echo“子字符串1-${BASH_重新匹配[1]}”
echo“子字符串2-${BASH_重新匹配[2]}”
echo“子字符串3-${BASH_重新匹配[3]}”
fi
完成
简单阵列:
#!/bin/bash
while read -r line; do
array1+=("$(echo "$line" | grep -oP '^\K(.+?)(?=,)')")
array2+=("$(echo "$line" | grep -oP '^.+?,\(\K(.+?)(?=\))')")
array3+=("$(echo "$line" | grep -oP '^.+?,\(.+?\),\(\K(.+?)(?=\))')")
done < "file.txt"
#/bin/bash
而read-r行;做
数组1+=(“$(echo“$line”| grep-oP'^\K(+?)(?=,)”)
array2+=(“$(echo“$line”| grep-oP'^.+?,\(\K(+?)(?=\))”)
数组3+=(“$(echo“$line”| grep-oP'^.+?,\(.+?\),\(\K(+?)(?=))”)
完成<“file.txt”
您可以合并2个阵列提案
#!/bin/bash
regex="^(.*),\((.*)\),\((.*)\)$"
while read line;do
if [[ $line =~ $regex ]];then
array1+=("${BASH_REMATCH[1]}")
array2+=("${BASH_REMATCH[2]}")
array3+=("${BASH_REMATCH[3]}")
fi
done < "infile"
for ((i=0;i<"${#array2[@]}";i++));do
echo "${array2[i]}"
done
#/bin/bash
regex=“^(.*),\(.*),\(.*)$”
读行时;做
如果[[$line=~$regex]];然后
数组1+=(“${BASH_重新匹配[1]}”)
array2+=(“${BASH_重赛[2]}”)
数组3+=(“${BASH_重新匹配[3]}”)
fi
完成<“填充”
对于((i=0;i只是为了好玩,另一个gnuawk解决方案,使用FPAT:
$ awk 'BEGIN{FS=",";
FPAT="[0-9]+|\\([^()]+\\)";
OFS="\n"}
{$1=$1;gsub(/[() ]/,"")}1' file
说明:
通过模式[0-9]+\\([^()]+\\)
我们描述了字段的外观,一些数字或括号之间除了parentese以外的任何内容
对此进行测试:
$ echo "2,(3, 4, 5, 7),(239, 531, 867, 412)" |
> awk 'BEGIN{FS=",";FPAT="[0-9]+|\\([^()]+\\)";OFS="\n"}{$1=$1;gsub(/[() ]/,"")}1'
2
3,4,5,7
239,531,867,412
最好添加您想要的输出。它应该是字面上的子字符串1-6
?除了为了清晰起见添加精确的预期输出外,您是否需要在bash数组中添加它们?等等,您还应该说明您是否有GNU命令…如果有,这也会起作用,您还需要进一步处理..您可以添加一些有关这些元组的详细信息在哪里来自python?@S.K,请将示例输入和预期输出显示到代码标记中。