Bash awk解析文件名并将结果添加到每行的末尾
我有许多文件有类似的名字,比如Bash awk解析文件名并将结果添加到每行的末尾,bash,awk,Bash,Awk,我有许多文件有类似的名字,比如 DWH_Export_AUSTA_20120701_20120731_v1_1.csv.397.dat.2012-10-02 04-01-46.out DWH_Export_AUSTA_20120701_20120731_v1_2.csv.397.dat.2012-10-02 04-03-12.out DWH_Export_AUSTA_20120801_20120831_v1_1.csv.397.dat.2012-10-02 04-04-16.out 等等 我需
DWH_Export_AUSTA_20120701_20120731_v1_1.csv.397.dat.2012-10-02 04-01-46.out
DWH_Export_AUSTA_20120701_20120731_v1_2.csv.397.dat.2012-10-02 04-03-12.out
DWH_Export_AUSTA_20120801_20120831_v1_1.csv.397.dat.2012-10-02 04-04-16.out
等等
我需要从文件名中获取.csv之前的数字(1或2),并使用制表符分隔符将其放入文件中每一行的末尾
我已经写了这段代码,它找到了我需要的号码,但我不知道如何将这个号码放入文件中。文件名中有空格,我的脚本因此中断
我也不知道,如何发送到脚本文件列表。现在我只处理一个文件
我的代码:
#!/bin/sh
string="DWH_Export_AUSTA_20120701_20120731_v1_1.csv.397.dat.2012-10-02 04-01-46.out"
out=$(echo $string | awk 'BEGIN {FS="_"};{print substr ($7,0,1)}')
awk ' { print $0"\t$out" } ' $string
使用sed:
$ sed 's/.*_\(.*\).csv.*/&\t\1/' file
DWH_Export_AUSTA_20120701_20120731_v1_1.csv.397.dat.2012-10-02 04-01-46.out 1
DWH_Export_AUSTA_20120701_20120731_v1_2.csv.397.dat.2012-10-02 04-03-12.out 2
DWH_Export_AUSTA_20120801_20120831_v1_1.csv.397.dat.2012-10-02 04-04-16.out 1
要对许多文件执行此操作,请执行以下操作:
sed 's/.*_\(.*\).csv.*/&\t\1/' file1 file2 file3
或
要使此更改保存在同一文件中(如果您已使用GNU):
使用sed:
$ sed 's/.*_\(.*\).csv.*/&\t\1/' file
DWH_Export_AUSTA_20120701_20120731_v1_1.csv.397.dat.2012-10-02 04-01-46.out 1
DWH_Export_AUSTA_20120701_20120731_v1_2.csv.397.dat.2012-10-02 04-03-12.out 2
DWH_Export_AUSTA_20120801_20120831_v1_1.csv.397.dat.2012-10-02 04-04-16.out 1
要对许多文件执行此操作,请执行以下操作:
sed 's/.*_\(.*\).csv.*/&\t\1/' file1 file2 file3
或
要使此更改保存在同一文件中(如果您已使用GNU):
如果我理解正确,您希望将文件名中的数字附加到该文件中的每一行-这应该可以做到:
#!/bin/bash
while [[ 0 < $# ]]; do
num=$(echo "$1" | sed -r 's/.*_([0-9]+).csv.*/\t\1/' )
#awk -e "{ print \$0\"\t${num}\"; }" < "$1" > "$1.new"
#sed -r "s/$/\t$num/" < "$1" > "$1.mew"
#sed -ri "s/$/\t$num/" "$1"
shift
done
#/bin/bash
而[[0<$#]];做
num=$(echo“$1”| sed-r的s/*.([0-9]+).csv.*/\t\1/'))
#awk-e“{print\$0\”\t${num}\”;}”<“$1”>“$1.new”
#sed-r“s/$/\t$num/”<“$1”>“$1.mew”
#sed-ri“s/$/\t$num/”“$1”
转移
完成
运行脚本并为其指定要处理的文件的名称。$#脚本的命令行参数数,该参数在循环结束时由
shift
递减,它删除第一个参数,并移动其他参数。从文件名中提取数字并从三行注释中选择一行进行追加:awk为您提供了更大的灵活性,第一个sed创建新文件,第二个sed处理它们(如果您运行的是GNU sed)。如果我理解正确,您希望将文件名中的数字附加到该文件中的每一行-这应该可以做到:
#!/bin/bash
while [[ 0 < $# ]]; do
num=$(echo "$1" | sed -r 's/.*_([0-9]+).csv.*/\t\1/' )
#awk -e "{ print \$0\"\t${num}\"; }" < "$1" > "$1.new"
#sed -r "s/$/\t$num/" < "$1" > "$1.mew"
#sed -ri "s/$/\t$num/" "$1"
shift
done
#/bin/bash
而[[0<$#]];做
num=$(echo“$1”| sed-r的s/*.([0-9]+).csv.*/\t\1/'))
#awk-e“{print\$0\”\t${num}\”;}”<“$1”>“$1.new”
#sed-r“s/$/\t$num/”<“$1”>“$1.mew”
#sed-ri“s/$/\t$num/”“$1”
转移
完成
运行脚本并为其指定要处理的文件的名称。$#脚本的命令行参数数,该参数在循环结束时由
shift
递减,它删除第一个参数,并移动其他参数。从文件名中提取数字并从三行注释中选择一行进行追加:awk为您提供了更大的灵活性,第一个sed创建新文件,第二个sed就地处理它们(如果您正在运行GNU sed)。未经测试,但这应该可以满足您的需要(提取.csv之前的数字,并将该数字附加到.out文件中每一行的末尾)
未测试,但这应该满足您的要求(提取.csv之前的数字,并将该数字附加到.out文件中每一行的末尾)
您可能希望使用sed或coreutils而不是awk 从文件名中获取编号,并使用grep表示多样性:
num=$(<<<filename grep -Eo '[^_]+\.csv' | cut -d. -f1)
使用-i
开关就地修改文件名
用浆糊
您还需要知道此方法的文件长度:
len=$(<filename wc -l)
完整示例
您可能希望使用sed或coreutils而不是awk
从文件名中获取编号,并使用grep表示多样性:
num=$(<<<filename grep -Eo '[^_]+\.csv' | cut -d. -f1)
使用-i
开关就地修改文件名
用浆糊
您还需要知道此方法的文件长度:
len=$(<filename wc -l)
完整示例
您假设数字的长度只有一位。请尝试:s/*.\(.*\).csv.*/&\t\1/
我实际上是在重新阅读一些awk
代码(请参见子字符串),您的第一个答案可能是正确的:s/.*\(.csv.*/&\t\1/
这是正确的解决方案。sed正是适合的:-)+1我说得太快了,我以为OP有行的文件要处理,但显然是他想从中提取1、2等的文件名,然后将它们附加到文件内容中。你假设这个数字的长度只有一位数。试试看:s/*\(.*\).csv.*/&\t\1/
我实际上在重读一些awk
代码(参见子字符串),您的第一个答案可能是对的:s/*\(.\).csv.*/&\t\1/
这是正确的解决方案。这正是sed所擅长的:-)+1我说得太快了,我以为OP有行文件要处理,但显然他想提取的是文件名1,2,等,然后将它们附加到文件内容中。test.sh:3:语法错误:重定向意外
我在完成后收到此错误example@erizo:bash似乎在测试中出现问题。sh:3:语法错误:重定向意外
我在完成测试后收到此错误example@erizo:bash似乎与注释说:“从三行注释中选择一行进行追加”-只需选择您喜欢的方式即可。ou,好的。对不起,我没听懂。没问题。:)考虑到这一点,我可能会建议使用第二个-sed
应该比awk
快,如果出现问题,它会保留原始文件不变(您可能希望选择一个比我使用的.mew
更好的后缀).答案很好,但是为什么在参数上使用while和shift而不是for循环呢?顺便说一句,除了上面的第一个sed,您不需要-r,如果您使用[0-9][0-9]*而不是[0-9]+,也不需要-r,这将使它不特定于GNU。最后,这不是将shell变量的值传递给awk脚本的推荐方法之一。@peterph-我也不会使用ENVIRON[“num”]。如果可能,请使用awk-v awkvar=“$shellvar””…”文件
,请参阅comp.unix.shell常见问题解答中的Q24。注释说:“从三个注释行中选择一行进行追加”-只需选择您喜欢的方式即可。ou,ok。对不起,我没听懂。没问题。:)考虑到这一点,我可能会建议
for filename in DWH_Export*; do
num=$(echo $filename | grep -Eo '[^_]+\.csv' | cut -d. -f1)
sed -i "s/\$/\t$num" $filename
done
for file in *
do
sfx=$(echo "$file" | sed 's/.*_\(.*\).csv.*/\1/')
sed -i "s/$/\t$sfx/" "$file"
done