我有一个文本文件,每一行的存储方式如下:
"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