bash - 为 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。
解决方案
鉴于:
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
您通常这样做:
- 用awk、cut、sed等修改文件
- 将输出重定向到临时文件
- 将临时文件重命名为原始文件名。
像这样:
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
推荐阅读
- php - 将“卷曲”引号与数据库查询中的标准引号匹配
- javascript - 将字符串替换为 3 种模式“space”、“and”、“or”
- jquery - 仅在鼠标悬停 2 次后显示图像?
- scala - hive 1.1 从三个表中取出层次值
- sql - 需要一些帮助来解决分组的 SQL 问题
- angular - angular 6: A class declaration without the 'default' modifier must have a name
- excel - 无法在 Listbox.RowSource 方法或 Listbox.List 方法中设置范围
- matplotlib - move facial landmarks using matplotlib
- tomcat - 向 tomcat 7.0.82 HTTP 连接器添加松弛查询字符会生成不匹配的属性警告
- amazon-web-services - AWS ECS scheduled scaling with terraform