首页 > 解决方案 > 为 unix 目录中的每个文件删除所有但选择列的命令

问题描述

我有一个包含许多文件的目录,并且想要编辑每个文件以仅包含选择的几列。

我有以下代码,它只会打印第一列

for i in /directory_path/*.txt; do awk -F "\t" '{ print $1 }' "$i"; done

但是如果我尝试通过添加 >'$I' 来编辑每个文件,如下所示,那么我会丢失文件中的所有信息

for i in /directory_path/*.txt; do awk -F "\t" '{ print $1 }' "$i" > "$i"; done

但是,我希望能够删除每个文件中除少数几列之外的所有列,例如 1 和 3。

标签: bashunix

解决方案


鉴于:

cat file
1 2 3
4 5 6

您可以使用 sed 进行就地编辑:

sed -i.bak -E 's/^([^[:space:]]*).*/\1/' file 

cat file
1
4

如果您想自由地处理多个列并进行就地编辑,请使用也支持就地编辑的 GNU awk:

gawk -i inplace '{print $1, $3}' file

cat file 
1 3
4 6

如果您只有 POSIX awk 或想使用cut您通常这样做:

  1. 用awk、cut、sed等修改文件
  2. 将输出重定向到临时文件
  3. 将临时文件重命名为原始文件名。

像这样:

awk '{print $1, $3}' file >tmp_file; mv tmp_file file

或与cut

cut -d ' ' -f 1,3 file >tmp_file; mv tmp_file file

要对目录中的文件执行循环,您将执行以下操作:

for fn in /directory_path/*.txt; do
    awk -F '\t' '{ print $1 }' "$fn" >tmp_file 
    mv tmp_file "$fn"
done    

推荐阅读