Awk 将行首的数字移动到行尾

Awk 将行首的数字移动到行尾,awk,sed,text-processing,Awk,Sed,Text Processing,我有一个Unixuniq-c命令的输出,该命令在每行开头打印字符串的出现次数。字符串表示由管道分隔的两位作者(例如,Aabdel Wahab S|Abdel Hafeez EH) 我需要grep事件编号并将其移动到行的末尾。例如: Aabdel-Wahab S|Abdel-Hafeez EH|1 Aabdel-Wahab S|Abdulla AM|1 Aabdel-Wahab S|Ahmad AK|4 Aabdel-Wahab S|Mosalem FA|1 Aabye MG|Andersen A

我有一个Unix
uniq-c
命令的输出,该命令在每行开头打印字符串的出现次数。字符串表示由管道分隔的两位作者(例如,
Aabdel Wahab S|Abdel Hafeez EH

我需要grep事件编号并将其移动到行的末尾。例如:

Aabdel-Wahab S|Abdel-Hafeez EH|1
Aabdel-Wahab S|Abdulla AM|1
Aabdel-Wahab S|Ahmad AK|4
Aabdel-Wahab S|Mosalem FA|1
Aabye MG|Andersen AB|1
Aabye MG|Changalucha J|8
Aabye MG|Christensen DL|1
Aabye MG|Faurholt-Jepsen D|1
请注意,频率现在以管道分隔。下面粘贴的是我在Awk中的一行:

awk '{num=$1;$1=""; sub(/^ /,""); print $0,"|",num;}' file
但是,Awk会在最终管道周围添加额外的空间:

Aabdel-Wahab S|Abdel-Hafeez EH | 1
Aabdel-Wahab S|Abdulla AM | 1
Aabdel-Wahab S|Ahmad AK | 4
Aabdel-Wahab S|Mosalem FA | 1
Aabye MG|Andersen AB | 1
Aabye MG|Changalucha J | 8
Aabye MG|Christensen DL | 1
Aabye MG|Faurholt-Jepsen D | 1

知道如何继续吗(不需要使用Awk)?

您可以使用
printf

awk '{num=$1;$1=""; sub(/^ /,""); printf("%s|%s\n",$0,num);}' file

您可以使用
printf

awk '{num=$1;$1=""; sub(/^ /,""); printf("%s|%s\n",$0,num);}' file

使用
sed

sed -r 's/\s*([0-9]+)\s*(.*)/\2|\1/' infile
  • \s*
    匹配零个或多个空格
  • ([0-9]+)
    匹配用于组匹配的一个或多个数字和括号
  • (.*)
    匹配用于组匹配的任何内容和括号
  • \2 |\1
    中,我们正在打印第二组匹配项,即
    (.*)
    ,下一组匹配项,即
    ([0-9]+)
    ,中间有管道
很可能,你会这样做:

sed 's/^ *\([0-9][0-9]*\) *\(.*\)$/\2|\1/' infile

使用
sed

sed -r 's/\s*([0-9]+)\s*(.*)/\2|\1/' infile
  • \s*
    匹配零个或多个空格
  • ([0-9]+)
    匹配用于组匹配的一个或多个数字和括号
  • (.*)
    匹配用于组匹配的任何内容和括号
  • \2 |\1
    中,我们正在打印第二组匹配项,即
    (.*)
    ,下一组匹配项,即
    ([0-9]+)
    ,中间有管道
很可能,你会这样做:

sed 's/^ *\([0-9][0-9]*\) *\(.*\)$/\2|\1/' infile

这是使用
sed
而不是
awk
的真实情况:

sed 's/^  *\([0-9][0-9]*\) *\(.*\)/\2|\1/' file
正则表达式细分:

  • ^*
    至少从一个空格开始
  • \(
    开始捕获第一组
    • [0-9][0-9]*
      至少匹配一位数字
  • \)
    CG one结束
  • *
    任意数量的空格字符
  • \(.*)
    捕获输入行的其余部分(CG 2)

替换字符串使用单个
|
更改捕获组的顺序。

这是使用
sed
而不是
awk
的真实情况:

sed 's/^  *\([0-9][0-9]*\) *\(.*\)/\2|\1/' file
正则表达式细分:

  • ^*
    至少从一个空格开始
  • \(
    开始捕获第一组
    • [0-9][0-9]*
      至少匹配一位数字
  • \)
    CG one结束
  • *
    任意数量的空格字符
  • \(.*)
    捕获输入行的其余部分(CG 2)

替换字符串用一个
|
来更改捕获组的顺序。

如果awk本身不添加空格,那么您是在告诉awk添加空格。您认为
打印1,2
中是什么意思(提示:在awk手册页中查找
OFS
)?不要这样做:

awk '{num=$1; $1=""; sub(/^ /,""); print $0 "|" num}' file

awk本身没有添加空格,您是在告诉awk添加空格。您认为
打印1,2
中是什么意思(提示:在awk手册页中查找
OFS
)?不要这样做:

awk '{num=$1; $1=""; sub(/^ /,""); print $0 "|" num}' file

同意。sed是对像这样的单行进行简单替换的正确工具。同意。sed是对像这样的单个行进行简单替换的正确工具。