Answers:
该-F
选项需要一个参数:-F,
例如。
awk
脚本的末尾必须用(space char)与其余参数分开。
如果字段分隔符是,
并且希望保留它,并且列数是恒定的并且小于或等于11,请尝试以下操作:
awk -F, '{print $1,$2,$3,$4,$5,$6,$8,$9,$10,$11,$7}' OFS=, "$file"
command file > newfile && mv newfile file
。也就是说,较新版本的GNU awk
支持此功能:gawk -i inplace '{blah blah}' file
。
mv newfile file
您可以使用cat newfile > file ; rm -f newfile
-这将保留inode和的权限file
。
mktemp
而不是将临时文件名硬编码到脚本中。例如tf=$(mktemp) ; command file > "$tf" ; cat "$tf" > file ; rm -f "$tf"
较短的解决方案是
awk -F',+' -v OFS=, '{$(NF+1)=$7; $7=""; $0=$0; $1=$1}1' file
我不确定是否,+
可以在所有awk
版本中使用,但至少在GNU awk中也可以使用-c
兼容模式。
说明:
$(NF+1)=$7
:首先我们在行尾添加第7个字段($12=$7
在这种情况下可能是)$7=""
:在下一步中,第7个字段将被删除(但周围的定界符会保留)$0=$0
),将多个逗号作为字段分隔符(这是通过来完成的-F',+'
,这里+
表示一次或多次),还需要通过重新排列当前记录$1=$1
来强制使用先前设置的输出字段来重建行分隔符(由选项设置-v OFS=,
)1
输入示例:
1,2,3,4,5,6,7,8,9,10,11
输出
1,2,3,4,5,6,8,9,10,11,7
,+
应该可以工作。
all,ball,call,,,fall
→ all,ball,call,fall
)。(2) $(NF+1)=$7
是一个聪明的方法。恕我直言,$0 = $0 OFS $7
它更清晰一点,只有几个字符更长,而且似乎做同样的事情。您能想到$0 = $0 OFS $7
与您的代码不同的情况吗?
$0=$0 OFS $7
可能与相同$(NF+1)=$7
,但仅在其余代码不变的情况下(一般而言)。
您可能是说:
awk -F, -v OFS='' '{print $1,$2,$3,$4,$5,$6,$8,$9,$10,$11,$7}' "$file"
awk
永远不会在中看到单引号OFS=''
吧?你也可以打字OFS=
; 完全一样
您并没有明确表示要使用awk,而是确实要使用像所提供的就地编辑sed -i
,所以这是一个sed -i
变体。通常awk
,使用列会更好,但这是我更喜欢的一种情况sed
,因为它自然可以处理任意数量的列。
MOVECOL=7
N=$((MOVECOL-1))
sed -r -e "s/^(([^,]*,){$N})([^,]*),(.*)/\1\4,\3/" -i test.csv
说明:
-r
选择扩展的正则表达式,因此我们避免了很多反斜杠当然,这对于用引号将逗号隐藏(或更糟糕的是,将其转义)的文件将不起作用,但是awk在没有一些严重的杂技的情况下也无法解决。如果您有此问题,最好使用perl
module Text:CSV
或python
module csv
。
几个awk
变体(假设您的文件位于变量中$file
)
在这里,您可以循环显示所有列,使用字段分隔符(OFS)打印,并在行尾打印记录终止符(ORS)。
awk -F',' -v OFS=, \
'{for(i=1;i<=NF;i++) if (i!=7) printf "%s",$i OFS; \
printf "%s",$7;printf ORS}' "$file"
在这里使用正则表达式和gensub()
功能
gawk -F',+' -v OFS=, '{$0=gensub(/\s*\S+/,"",7) OFS $7}1' "$file"
杀死 7 个字段并且在该行的末尾打印。
$0
是整个记录 $n
是第n 个记录 NF
是当前行的字段数 OFS
输出字段分隔符ORS
输出记录终止符1
说awk true
并打印默认值($0
)的技巧。更新 ...
我差点忘了,它可以将所有继7列转移日之一。
awk -F',' -v OFS=, '{tmp=$7; for(i=7;i<=NF;i++) $i=$(i+1); $NF=tmp}1 ' "$file"
OFS $7
会比强大"," $7
。(2)我认为这", " $7
是错误的,因为问题表明OP不需要在逗号后加空格。(而且,如果输入数据在逗号后有空格,则该空格$7
将以空格开头,并且您将添加一个空格。)
OFS $7
,不仅更强大,而且更一般(“浪费使浪费”)
^
指示在那里遇到错误命令的特定部分。