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

时间:2016-04-14 10:02:16

标签: 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

有什么想法吗?

4 个答案:

答案 0 :(得分:2)

使用循环迭代其余列,如下所示:

awk '{print $1,"1","2","1";for(i=2;i<=NF;i++) print $i}'

举个例子:

$echo "3  5  2  2" | awk 'BEGIN{ORS=""}{print $1,"1","2","1";for(i=2;i<=NF;i++) print $i}'
3 1 2 1 5 2 2
$

Edit1:

$ echo "3  5  2  2" | awk 'BEGIN{ORS="\n";OFS="\n"}{print $1,"1","2","1 ";for(i=2;i<=NF;i++) print $i" "}'
3
1
2
1
5
2
2
$

Edit2:

$ echo "3  5  2  2" | awk '{print $1,"1","2","1";for(i=2;i<=NF;i++) print $i}'
3 1 2 1
5
2
2
$

Edit3:

$ echo "3 5 2 2
3 5 2 2
3 5 2 2
3 5 2 2" | awk '{printf("%s %s ", $1,"1 2 1");for(i=2;i<=NF;i++) printf("%s ", $i); printf "\n"}'
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 :(得分:1)

您可以使用sed通过将第一个空格替换为所需的字符串来执行此操作。

sed 's/ / 1 2 1 /' file

(OR)

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

awk '{$1=$1 " 1 2 1"}1' file

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

答案 2 :(得分:1)

你几乎就在那里,你只需要将第一列存储在一个临时变量中:

{
  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}'

答案 3 :(得分: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”替换第二个字段,然后用第二个字段替换。