unix 从cut命令强制输出字段的顺序

tpxzln5u  于 2023-11-18  发布在  Unix
关注(0)|答案(3)|浏览(130)

我想做这样的事情:

cat abcd.txt | cut -f 2,1

字符串
我希望输出的顺序是2,然后是1。在我测试的机器上(FreeBSD 6),这是不会发生的(它以1,2的顺序打印)。你能告诉我怎么做吗?
我知道我总是可以写一个shell脚本来做这个逆转,但我正在寻找的东西使用'削减'命令选项。
我想我使用的是包含cut的coreutils 5.2.1版本。

rqdpfwrv

rqdpfwrv1#

使用cut无法完成此操作。根据手册页:
所选输入的写入顺序与读取顺序相同,并且只写入一次。
修补cut已经是proposedmanytimes,甚至是complete patches have been rejected
相反,您可以使用awk来执行此操作,如下所示:

awk '{print($2,"\t",$1)}' abcd.txt

字符串
\t替换为您正在使用的字段分隔符。

vzgqcmou

vzgqcmou2#

Lars的答案很棒,但我发现了一个更好的答案。他的问题是它匹配\t\t,因为没有列。要解决这个问题,请使用以下命令:

awk -v OFS="  " -F"\t" '{print $2, $1}' abcd.txt

字符串
其中:
-F"\t"是在 exactly 上剪切的内容(制表符)。
-v OFS=" "是用来分隔的(两个空格)
范例:

echo 'A\tB\t\tD' | awk -v OFS="    " -F"\t" '{print $2, $4, $1, $3}'


这将产生:

B    D    A

ddhy6vgd

ddhy6vgd3#

以下是perl版本,仅供参考:

cat abcd.txt | perl -ne 'chomp; @F=split; print("$F[1]\t$F[0]\n")'

字符串
我显式地使用split,因为我通常只想在\tsplit("\t"))上进行拆分。

相关问题