Awk在单独的行上打印不同的字符

时间:2015-08-12 07:32:12

标签: awk grep

我一直在搜索aorund并找不到答案......想知道是否有人可以在这里提供帮助。

假设我有以下文件内容:

File1中:

name Joe 
day Wednesday
lunch was fish

name John 
dinner pie
day tuesday
lunch was noodles

name Mary
day Friday
lunch was fish pie

我只想打印并打印他们的名字以及他们午餐吃的东西。

我想我能做到

cat file1 | grep -iE 'name|lunch'

但是,如果我想做一个awk只是让他们的名字和食物如下面的输出那么?

Joe
fish
John
noodles
Mary
fish pie

我知道使用awk进行打印,但这可能需要awk,是否可以让awk在一行上打印$ 2,在另一行打印$ 3?

我还能以这种格式输出它:

Person food
Joe    fish
John   noodles
Mary   fish pie

由于

2 个答案:

答案 0 :(得分:2)

例如,您可以说:

$ awk '/name/ {print $2} /lunch/ {$1=$2=""; print}' file
Joe
  fish
John
  noodles
Mary
  fish pie

或删除lunch was文字:

awk '/name/ {print $2} /lunch/ {gsub("lunch was ",""); print}' file

将输出分为两列:

$ awk -v OFS="\t" '/name/ {name=$2} /lunch/ {gsub("lunch was ",""); print name, $0}' a
Joe     fish
John    noodles
Mary    fish pie

答案 1 :(得分:2)

AWK

用awk你可以一次性完成,

awk -v RS="" '{n=$2;sub(/.*lunch was\s*/,"");print n,$0}' file

请注意,使用此单行,应修复输入文件的格式。您的数据应存储在数据块中,lunch was行应位于每个数据块的末尾。

用你的例子测试:

kent$  awk -v RS="" '{n=$2;sub(/.*lunch was\s*/,"");print n,$0}' file 
Joe fish
John noodles
Mary fish pie

grep& SED

你也可以分两步完成,grep值,合并行

grep -Po 'name\s*\K.*|lunch was\s*\K.*' file|sed 'N;s/\n/ /'

输入文件,输出:

kent$  grep -Po 'name\s*\K.*|lunch was\s*\K.*' file|sed 'N;s/\n/ /'
Joe fish
John noodles
Mary fish pie