如何交换这样的文件中的列?

如何交换这样的文件中的列?

我有一个文本文件,每一行的存储方式如下:

"Video or movie"    "parent"    "Media or entertainment"    "1" "1" "1" "0" "0"

我想将第 3 列与第 2 列交换,即

"Video or movie"   "Media or entertainment"  "parent"   "1" "1" "1" "0" "0"

如何在 Linux 中使用 shell 脚本或任何其他脚本语言来做到这一点?我只需要一种最简单、最快的方法。

答案1

可以通过awk使用"字段分隔符来完成。但是这样做时,您必须记住它$1是空的,$2保存第一个字符串,$3是字符串之间的空格,$4是第二个字符串,等等。此外,交换两个字符串更可靠,而不是仅仅打印所有字段并希望您输入够了$n。考虑到这些,以下应该有效:

awk 'BEGIN{OFS=FS="\""} {tmp=$4;$4=$6;$6=tmp;print}' input_file >output_file

答案2

这是一个快速而肮脏的sed方法:

sed -e 's/^\("[^"]*"\) *\("[^"]*"\) *\("[^"]*"\)/\1 \3 \2/'

但对于值中带有双引号的字段会失败,等等。

一个例子:

echo \"a\" \"b\" \"c d d d\" \"e\" | sed -e 's/^\("[^"]*"\) *\("[^"]*"\)  *\("[^"]*"\)/\1 \3 \2/'

但我很确定有人能够向您展示一种awk更简单、更好的俏皮话。

答案3

我会选择:

sed 's/"\(.*\)"/\1/' |
    awk 'BEGIN{FS="\" +\"";OFS="\" \""}{t=$3;$3=$2;$2=t;print}' |
    sed 's/.*/"&"/'

这两个sed脚本处理前导和尾随双引号(因为它们不是分隔符并且不会干扰)。该BEGIN子句处理字段的分隔。这t=$3;$3=$2;$2=t是标准的交换字段习惯用法,然后打印整个字段(使用 OFS 作为字段分隔符)。

答案4

像这样的事情怎么样:

awk '{print $1, $3, $2, $4, $5, $6, $7, $8}' file > newfile

相关内容