首页 > 解决方案 > Bash 脚本剪切和文件名未硬编码

问题描述

我有一个名为 names.txt 的文件,如下所示:

0,james,hard,fun,circle

1,caron,hard,agin,square

我想让它最终像:

james,hard,fun,circle,c0

caron,hard,agin,square,c1

我想运行一个请求文件的脚本,然后使用 $1 参数对文件进行这些更改并剪切。

我知道这是一个可能涉及大量代码的难题,所以我非常感谢你们的帮助。

注意:我的文件包含 9999 个输入,第一个输入是 0 ,所以总共有 10,000 个。

标签: linuxbash

解决方案


这是一个完整的文件,它将按照您的要求修改文件并将其写入终端,特别是标准输出,这是默认情况下写入终端的“通道”之一。(渠道不是一个技术术语)。

#!/bin/bash
awk -F, -vOFS=, '{print $0,"c" $1 }' "$1" | cut -d, -f2-

awk如果数据中包含空行,我们可以通过在片段中添加检查来跳过它们。

#!/bin/bash
awk -F, -vOFS=, 'NF > 0 {print $0,"c" $1 }' "$1" | cut -d, -f2-

如果文件被命名rotate.sh并且您的数据whatever.csv,您可以调用为

bash rotate.sh whatever.csv

这会将修改后的文件打印到您的终端。如果你想把它保存在某个地方,写这个。

bash rotate.sh whatever.csv > /tmp/a.csv

不写以下

bash rotate.sh whatever.csv > whatever.csv

上面的脚本不能修改它正在读取的同一个文件。

sed@lurker 提供的示例脚本可以在 Linux 上运行。如果按字面意思在命令行中键入它,它将修改文件。

 sed -i "s/^\([0-9]*\),\(.*\)$/\2,c\1/" whatever.csv

该命令的 OS X 等效项是

 sed -i '' "s/^\([0-9]*\),\(.*\)$/\2,c\1/" whatever.csv

推荐阅读