我一直在搜索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
由于
答案 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 -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值,合并行
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