Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
bash-读取一行,使用sed/awk拆分元组_Bash_Awk_Sed - Fatal编程技术网

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,请将示例输入和预期输出显示到代码标记中。