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

时间:2014-04-23 12:37:38

标签: 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

5 个答案:

答案 0 :(得分:2)

$ awk -F'[ =,]+' '{
    ofs=""
    for (i=3;i<NF;i+=2) {
        if ($i~/[AD]/) {
            printf "%s%s",ofs,$(i+1)
            ofs=OFS
        }
    }
    print ""
}' file
123 456 1234
456
123 789

答案 1 :(得分:1)

试试这个。

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

输入:

$ cat in.txt 
A=123, B=456, C=123, A=456, D=1234
B=123, A=456
A=123, A=789

用法:

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

答案 2 :(得分:1)

Pure Bash。删除“x = ...,”,其中x不是A或B:

shopt -s extglob

while read  line ; do
  line="${line//[^AD]=+([0-9])?(, )/}"
  line="${line//[AD=,]/}"
  echo "$line"
done < "$infile"

输出

123 456 1234
456
123 789

答案 3 :(得分:0)

替代方式,使用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 

答案 4 :(得分:0)

这可能适合你(GNU sed):

sed -rn '/\<[AD]=/{s//\n/g;s/[^\n]*\n([0-9]*)[^\n]*/ \1/g;s/^ //p}' file

如果一行包含AD变量,则用换行符替换所述变量名称,然后提取下面的数字序列,在前面放置一个空格作为分隔符。最后删除第一个空格并打印出来。