Bash 在分隔符、sed或awk之间打印多个文本字段

Bash 在分隔符、sed或awk之间打印多个文本字段,bash,awk,sed,Bash,Awk,Sed,我有一些文本,其中分隔符列计数/顺序不相同 Line 1 A=123, B=456, C=123, A=456, D=1234 Line 2 B=123, A=456 Line 3 A=123, A=789 我只想打印每行中的As和Ds,最好的方法是什么 所以输出应该是, 123 456 1234 456 123 789 123 456 1234 456 123 789 试试这个 BEGIN { FS=", " } { for (i = 1; i <= NF;

我有一些文本,其中分隔符列计数/顺序不相同

Line 1 A=123, B=456, C=123, A=456, D=1234    
Line 2 B=123, A=456    
Line 3 A=123, A=789
我只想打印每行中的As和Ds,最好的方法是什么

所以输出应该是,

123 456 1234
456
123 789
123 456 1234
456
123 789
试试这个

BEGIN { FS=", " }
{
    for (i = 1; i <= NF; i++) {
        split($i, parts, "=")
        if (parts[1] == "A" || parts[1] == "D") {
            printf("%s ", parts[2])
        }
    }
    print ""
}
用法:

$ gawk -f s.awk in.txt
123 456 1234 
456 
123 789 
试试这个

BEGIN { FS=", " }
{
    for (i = 1; i <= NF; i++) {
        split($i, parts, "=")
        if (parts[1] == "A" || parts[1] == "D") {
            printf("%s ", parts[2])
        }
    }
    print ""
}
用法:

$ gawk -f s.awk in.txt
123 456 1234 
456 
123 789 

替代方式,使用awk:

$ awk -F'[ =,]+' '{for (i=1; i<NF;i+=2) if ($i=="A" || $i =="D")printf "%s ", $(i+1);print ""}' file
123 456 1234 
456 
123 789 

$awk-F'[=,]+'{for(i=1;i替代方式,带awk:

$ awk -F'[ =,]+' '{for (i=1; i<NF;i+=2) if ($i=="A" || $i =="D")printf "%s ", $(i+1);print ""}' file
123 456 1234 
456 
123 789 
$awk-F'[=,]+'{for(i=1;i纯Bash.Remove“x=…,”,其中x不是A或B:

shopt -s extglob

while read  line ; do
  line="${line//[^AD]=+([0-9])?(, )/}"
  line="${line//[AD=,]/}"
  echo "$line"
done < "$infile"
纯Bash。删除“x=…,”,其中x不是A或B:

shopt -s extglob

while read  line ; do
  line="${line//[^AD]=+([0-9])?(, )/}"
  line="${line//[AD=,]/}"
  echo "$line"
done < "$infile"
$awk-F'[=,]+''{
ofs=“”
对于(i=3;i
$awk-F'[=,]+''{
ofs=“”
对于(i=3;i这可能适用于您(GNU-sed):

sed-rn'/\这可能适合您(GNU-sed):


sed-rn'/\n你试过什么吗?展示它!第一行是输入的一部分吗?你试过什么吗?展示它!第一行是输入的一部分吗?没有必要将.txt中的文件
重定向到
gawk
的stdin;
gawk
可以通过参数从文件中获取输入。@flower True,更改了。只要提及它将在每行末尾添加一个空格,以便OP得到一个平头。此外,split()的第三个参数是一个RE,因此您应该对其进行分隔(即
/=/
,而不是
“=”
)为清晰起见,它对某些字符产生了功能上的差异,
printf
是一个内置的,而不是一个函数,因此当您编写
printf(…)
时,paren不会做他们看起来做的事情(但无论如何都应该可以)。最后,这将失败,因为实际的输入文件是OP发布的,每行都以文本开头,如
第1行
。没有必要将.txt
中的文件
重定向到
gawk
的stdin;
gawk
可以通过参数从文件中获取输入。@flow为True,更改了这一点。只需提及它会在因此OP的每一行都有一个平头。split()的第三个参数也是一个RE,因此您应该对其进行分隔(即
/=/
,而不是
“=”
)为清晰起见,它对某些字符产生了功能上的差异,
printf
是一个内置的,而不是一个函数,因此当您编写
printf(…)
时,paren不会做他们看起来做的事情(但无论如何都应该可以)。最后,如果实际输入文件为OP,则此操作将失败。OP张贴的每一行都以文本开头,如
第1行
。您张贴的输出与问题的预期输出不匹配。感谢所有建议,我实际上对我正在编写的脚本的另一部分有了想法。对于这一部分,我可能最终会使用using 1行awk。@HungryFerret您知道您可以在1行中编写任何awk脚本,对吗?除非您需要将其从历史记录文件中拉回来进行编辑,否则它不会增加任何好处,即使这样,它也是次要的…您发布的输出与问题的期望输出不匹配。谢谢大家的建议,我实际上有了另一个想法我正在编写的脚本的一部分。对于这个特定的脚本,我可能最终会使用1行awk。@HungryFerret您知道您可以在1行中编写任何awk脚本,对吗?除非您需要从历史文件中提取它以进行编辑,否则它不会增加任何好处,即使它很小……只要提到它,它会在每个l的末尾添加一个空格所以OP得到了一个正面。只要提到它会在每一行的末尾添加一个空格,这样OP就得到了一个正面。