用于删除 unix 目录中每个文件的所有列(仅选择列)的命令

Bri*_*ian 0 unix bash

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

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

for i in /directory_path/*.txt; do awk -F "\t" '{ print $1 }' "$i"; done
Run Code Online (Sandbox Code Playgroud)

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

for i in /directory_path/*.txt; do awk -F "\t" '{ print $1 }' "$i" > "$i"; done
Run Code Online (Sandbox Code Playgroud)

不过,我希望能够删除每个文件中除选定的几列之外的所有列,例如 1 和 3。

daw*_*awg 5

鉴于:

cat file
1 2 3
4 5 6
Run Code Online (Sandbox Code Playgroud)

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

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

cat file
1
4
Run Code Online (Sandbox Code Playgroud)

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

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

cat file 
1 3
4 6
Run Code Online (Sandbox Code Playgroud)

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

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

就像这样:

awk '{print $1, $3}' file >tmp_file; mv tmp_file file
Run Code Online (Sandbox Code Playgroud)

或者与cut:

cut -d ' ' -f 1,3 file >tmp_file; mv tmp_file file
Run Code Online (Sandbox Code Playgroud)

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

for fn in /directory_path/*.txt; do
    awk -F '\t' '{ print $1 }' "$fn" >tmp_file 
    mv tmp_file "$fn"
done    
Run Code Online (Sandbox Code Playgroud)