我有一些文本,其中分隔符列数/顺序不是一行一行。
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
答案 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
如果一行包含A
或D
变量,则用换行符替换所述变量名称,然后提取下面的数字序列,在前面放置一个空格作为分隔符。最后删除第一个空格并打印出来。