awk 或 sed,将第一列移到末尾?

awk 或 sed,将第一列移到末尾?

我有一个用空格分隔的文本文件,如下所示。我需要重新排列列,以便第一列位于每行的末尾。

我知道如何使用 or 来完成此操作cut -d' ' f1,但我想知道是否有一种简单的awk方法sed

文本文件:

™️       trade mark
ℹ️       information
↔️..↙️    left-right arrow..down-left arrow
↩️..↪️    right arrow curving left..left arrow curving right
⌚..⌛    watch..hourglass done
⌨️       keyboard
⏏️       eject button
⏩..⏳    fast-forward button..hourglass not done
⏸️..⏺️    pause button..record button
Ⓜ️       circled M
▪️..▫️    black small square..white small square
▶️       play button
◀️       reverse button

希望符号列表遵循描述。

答案1

使用sed

sed 's/\([^ ]*\) *\(.*\)/\2 \1/' infile

\([^ ]*\)将匹配所有内容,直到看到非空格字符。
括号\(...\)用于进行组匹配,其索引为\1

匹配\(.*\)第一组之后的所有内容并对其进行索引\2。匹配组中的
in *out\(...\) *\(...\)将忽略在输出中打印与组 1 和组 2 之间匹配空格的内容,您可以使用\s*(使用 GNU sed)或[[:space:]]*(标准)来匹配任何空格字符,而不仅仅是 ASCII SPC。

然后最后我们首先打印匹配的组2组1之间有一个空格。

答案2

awk '{first = $1; $1=""; print $0, first}' file.txt

将第一列存储在变量中,将空白写入第一列,打印整行($0$是整行,现在第一列为空),然后是第一列。

答案3

awk '{ printf "%s ",$NF;for (i=2;i<=NF-1;i++) { printf " %s",$i } printf "\n" }' filename

对于 awk,$NF 将表示最后一条数据。打印此内容,然后循环遍历其他字段,从 2 到 1,但最后一个字段除外,并打印这些字段。

答案4

使用 Perl:

perl -pe 's/(\S+)(\s+)(.*)/$3$2$1/' file

(\S+)从头开始捕获所有非空白字符

(\s+)捕获捕获字符后面的所有空格

(.*)捕获所有其他内容,直到行尾

$3$2$1反转 3 个匹配的模式

相关内容