Bash awk:打印第一列,然后是一些值,然后是所有其他列

Bash awk:打印第一列,然后是一些值,然后是所有其他列,bash,awk,Bash,Awk,我想打印第一列,然后打印两列固定值的列,就像这个命令所做的那样: awk '{print $1,"1","2","1"}' 然后打印除第一列之外的所有列。。。 我知道该命令打印除第一列以外的所有列: awk '{$1=""; print $0}' 但这就去掉了第一列 换言之,这: 3 5 2 2 3 5 2 2 3 5 2 2 3 5 2 2 需要做到这一点: 3 1 2 1 5 2 2 3 1 2 1 5 2 2 3 1 2 1 5 2 2 3 1 2 1 5 2 2 有什么想法吗

我想打印第一列,然后打印两列固定值的列,就像这个命令所做的那样:

awk '{print $1,"1","2","1"}' 
然后打印除第一列之外的所有列。。。 我知道该命令打印除第一列以外的所有列:

awk '{$1=""; print $0}' 
但这就去掉了第一列

换言之,这:

3 5 2 2
3 5 2 2
3 5 2 2
3 5 2 2
需要做到这一点:

3 1 2 1 5 2 2
3 1 2 1 5 2 2
3 1 2 1 5 2 2
3 1 2 1 5 2 2

有什么想法吗?

使用循环遍历其他列,如下所示:


awk'{print$1,“1”,“2”,“1”;for(i=2;i使用循环遍历其余列,如下所示:


awk'{print$1,“1”,“2”,“1”;for(i=2;i您可以使用
sed
将第一个空格替换为所需的字符串来执行此操作

sed 's/ / 1 2 1 /' file
(或)

使用
awk
替换第一个字段(
$1
):


(我更喜欢
sed
解决方案,因为它的字符较少)。

您可以使用
sed
将第一个空格替换为所需的字符串来完成此操作

sed 's/ / 1 2 1 /' file
(或)

使用
awk
替换第一个字段(
$1
):


(我更喜欢
sed
解决方案,因为它的字符数较少)。

您就快到了,只需将第一列存储在临时变量中:

{
  head=$1; # Store $1 in head, used later in printf
  $1=""; # Empty $1, so that $0 will not contain first column
  printf "%s 1 2 1%s\n", head, $0
}
和完整的脚本:

echo "3 5 2 2" | awk '{head=$1;$1="";printf "%s 1 2 1%s\n", head, $0}'

就快到了,只需将第一列存储在临时变量中:

{
  head=$1; # Store $1 in head, used later in printf
  $1=""; # Empty $1, so that $0 will not contain first column
  printf "%s 1 2 1%s\n", head, $0
}
和完整的脚本:

echo "3 5 2 2" | awk '{head=$1;$1="";printf "%s 1 2 1%s\n", head, $0}'

使用awk的另一种解决方案

awk '{sub(/.*/, "1 2 1 "$2, $2)}1' File
3 1 2 1 5 2 2
3 1 2 1 5 2 2
3 1 2 1 5 2 2
3 1 2 1 5 2 2

将第二个字段替换为“1 2 1”,然后再替换第二个字段本身。

另一个解决方案为
awk

awk '{sub(/.*/, "1 2 1 "$2, $2)}1' File
3 1 2 1 5 2 2
3 1 2 1 5 2 2
3 1 2 1 5 2 2
3 1 2 1 5 2 2

将第二个字段替换为“1 2 1”,后跟第二个字段本身。

谢谢!这几乎可以工作,除了它似乎在一行中打印所有内容…(如果您在示例命令中创建多行,他将打印第一行中的所有行),您可以使用
ORS=“\n”
OFS=“\n”
不幸的是,它会将所有值打印在新行上……如果您的原始文件包含“3 5 2 2”,但在四行上,您可以让它工作吗?(即,创建一个新文件,在四行上包含“3 1 2 1 5 2 2”)您在“编辑2”中所做的操作:我需要“3 1 2 1 5 2 2”全部在第一行上,他需要在这之后开始第二行,然后打印“3 1 2 1 5 2 2”再次出现(考虑到输入文件的第二行也有“3 5 2 2 2”;您的输入现在只有一行,我的有多行)。您可以通过编辑问题来发布您的预期输出,而不是在评论中进行长时间的讨论,以澄清问题!这几乎可以工作,除了它似乎在一行中打印所有内容。。。(如果您在示例命令中创建了多行,他将打印第一行中的所有行)为此,您可以使用
ORS=“\n”
OFS=“\n”
不幸的是,它会在新行上打印所有值……如果您的原始文件包含“3 5 2 2”,但在四行上,您能让它工作吗?(即,使用3 1 2 1 5 2 2 4行)你在编辑2中做了什么:我需要“3 1 2 1 5 2 2”全部在第一行,他需要在那之后开始第二行,然后再次打印“3 1 2 1 5 2 2”(假设输入文件的第二行也有“3 5 2 2”;你的输入现在只有1行,我的有多行)。你能通过编辑问题以澄清问题,而不是在评论中进行长时间的讨论吗
awk '{sub(/.*/, "1 2 1 "$2, $2)}1' File
3 1 2 1 5 2 2
3 1 2 1 5 2 2
3 1 2 1 5 2 2
3 1 2 1 5 2 2