Bash 在第1列中查找特定关键字,并在第2列shell脚本中追加新行
我有一个文本文件,如下所示:Bash 在第1列中查找特定关键字,并在第2列shell脚本中追加新行,bash,shell,awk,sed,Bash,Shell,Awk,Sed,我有一个文本文件,如下所示: empty 2 23 8 19 1 empty 11 如果第1列有关键字“empty”,我将尝试在第2列追加新行。有人知道怎么做吗?以下是预期输出: empty 23 2 19 8 empty 11 1 awk救援 $ awk 'p{t=$2;$2=p;p=t} $1=="empty"{if($2!=""){p=$2;$2=""}}1' f
empty 2
23 8
19 1
empty
11
如果第1列有关键字“empty”,我将尝试在第2列追加新行。有人知道怎么做吗?以下是预期输出:
empty
23 2
19 8
empty
11 1
awk
救援
$ awk 'p{t=$2;$2=p;p=t} $1=="empty"{if($2!=""){p=$2;$2=""}}1' file
empty
23 2
19 8
empty
11 1
awk
救援
$ awk 'p{t=$2;$2=p;p=t} $1=="empty"{if($2!=""){p=$2;$2=""}}1' file
empty
23 2
19 8
empty
11 1
以下是gnu awk的脚本:
{ col1[ FNR ] = $1
col2[ FNR ] = sprintf("%s %s",$2, $3)
}
END {
k2 = 0;
for( k1 = 1; k1 <= FNR; k1++) {
if( col1[ k1 ] != "empty" ){
k2++
print col1[ k1], col2[ k2]
}
else print col1[ k1]
}
}
{col1[FNR]=$1
col2[FNR]=sprintf(“%s%s”,$2,$3)
}
结束{
k2=0;
对于(k1=1;k1,这里有一个gnu awk脚本:
{ col1[ FNR ] = $1
col2[ FNR ] = sprintf("%s %s",$2, $3)
}
END {
k2 = 0;
for( k1 = 1; k1 <= FNR; k1++) {
if( col1[ k1 ] != "empty" ){
k2++
print col1[ k1], col2[ k2]
}
else print col1[ k1]
}
}
{col1[FNR]=$1
col2[FNR]=sprintf(“%s%s”,$2,$3)
}
结束{
k2=0;
对于(k1=1;k1您能澄清一下吗?您所要求的内容与您的“Before”和“After”图片不匹配:。在第2列添加换行符将"“2”在单独的一行上,它不会导致它向下推“8”和“1”。您的“之后”图片表明您确实希望将文件视为列,而不是行。是的,您是对的,Greg。我希望将此文件也保留为列。就像输出文件中所述。有什么想法吗?谢谢。您能澄清一下吗?您要求的是什么与“Before”和“After”图片不匹配:。将换行添加到第2列将导致“'2'在单独的一行上,它不会导致它向下推'8'和'1'。您的'After'图片表明您确实希望将文件视为列,而不是行。是的,您是对的,Greg。我希望将此文件也保留为列。就像输出文件上所述。有什么办法吗?谢谢,是的,它适用于3”空”第一栏的单词!但是,如果我们有更多的“空”怎么办第1列的单词?因为它会跳过第2列的一些值。非常感谢!我真的很喜欢它。请发布一个测试输入,我不确定我是否理解你的意思。测试输入实际上由3列组成。我想像前面提到的那样处理它。我通过以下链接粘贴了它:谢谢!是的,它适用于3“空”第一栏的单词!但是,如果我们有更多的“空”怎么办第1列的单词?因为它会跳过第2列的一些值。非常感谢!我真的很喜欢它。请发布一个测试输入,我不确定我是否理解你的意思。测试输入实际上由3列组成。我想像我前面提到的那样处理它。我通过以下链接粘贴了它:谢谢!