如何使用sed显示记录的某些列

时间:2012-07-07 16:13:53

标签: linux sed

我有一个这样的清单:

5678:robert dylan   :d.g.m. :marketing  :04/19/43 85000

我只想显示此人的姓名和名称。我想使用sed。我该怎么做?

4 个答案:

答案 0 :(得分:2)

<强>更新

echo "5678:robert dylan :d.g.m. :marketing :04/19/43 85000" | 
sed 's/:/\n/g' | sed '1d;3d;$d'| sed 'N;s/\n/ - /'

产量

robert dylan - marketing

说明:

通过将行拆分为基于:的几行,删除第一行,第三行和最后一行,然后再将它们连接起来。

注意:在最后一个表达式中,您可以通过在/ /的最后一组中添加其他内容来指定名称与名称之间的区别{1}}


以前的AWK解决方案

不是'N;s/\n/ /',但如果可以接受,则sed是非常自然的工具:

awk

产量

$ echo "5678:robert dylan :d.g.m. :marketing :04/19/43 85000" | awk -F":" '{print $2, $4}'

或者,如果您的数据存储在名为robert dylan marketing 的文件中:

data.txt

会产生相同的输出。

awk非常适合这类任务。

解释

awk -F":" '{print $2, $4}' data.txt

awk -F":" '{print $2, $4}' 将字段分隔符设置为-F:分别打印结果字段2和4。您可以使用print $2, $4根据需要格式化输出。

答案 1 :(得分:2)

这可能对您有用:

echo "5678:robert dylan :d.g.m. :marketing :04/19/43 85000" |
sed 's/[^:]*:\([^:]*:\)[^:]*:\([^:]*\):.*/\1\2/'
robert dylan :marketing

说明:

替代命令的左侧(LHS)表示:

  • [^:]*:匹配零个或多个非:后跟: - 这匹配5678:
  • \([^:]*:\)如上所述,但会被记住作为后方参考\1 - 匹配robert dylan :
  • [^:]*:如上所述但没有后退引用 - 匹配d.g.m. :
  • 如上所述
  • \([^:]*\):除外,但会被记住作为后方参考\2 - 匹配marketing
  • :.*一个:后跟其他所有内容 - 匹配:04/19/43 85000

替代命令的右侧说:

  • \1\2用第一个和第二个后引用替换左侧。

答案 2 :(得分:1)

我想我会使用cut

进入解决方案
 cut -d ":" -f 2,4

产生:

 robert dylan :marketing

答案 3 :(得分:0)

类似于Lavon's approach,但适用于多个记录

sed -n 's/:/\n/pg' file | sed -n '2~5h;4~5{H;g;s/\n/|/g;p}'

将产生

robert dylan |marketing 
penny farthing |accident & emergency 
...

对于输入文件

5678:robert dylan :d.g.m. :marketing :04/19/43 85000
8076:penny farthing :d.g.m. :accident & emergency :04/19/43 85000
...

首先用:新行替换\n,以使每条记录获得5行;然后 对于每组5行,请复制第2行并将第4行追加到保留空间,转移到图案空间,用分隔符(在这种情况下为\n代替|并打印。 (如果您不关心列顺序,{H;g;...可以缩短为{G;...。)