我的文件数量与
类似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)之前的数字,然后将其放入带有TAB分隔符的文件中的每一行的末尾。
我已经编写了这段代码,它找到了我需要的号码,但我不知道如何将这个号码放入档案中。文件名中有空格,我的脚本因此而中断。
另外我不确定,如何发送到脚本文件列表。现在我只使用一个文件。
我的代码:
#!/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
答案 0 :(得分:2)
for file in *
do
sfx=$(echo "$file" | sed 's/.*_\(.*\).csv.*/\1/')
sed -i "s/$/\t$sfx/" "$file"
done
答案 1 :(得分:1)
使用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
OR
sed 's/.*_\(.*\).csv.*/&\t\1/' file*
要使此更改保存在同一个文件中(如果您有GNU sed):
sed -i 's/.*\(.\).csv.*/&\t\1/' file
答案 2 :(得分:0)
如果我理解正确,你想要将文件名中的数字附加到该文件中的每一行 - 这应该这样做:
#!/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
运行脚本并为其指定要处理的文件的名称。 $#是脚本的命令行参数的数量,它在循环结束时递减shift
,它会删除第一个参数,并移动其他参数。从文件名中提取数字并选择三个注释行中的一个来执行追加:awk为您提供更大的灵活性,第一个sed创建新文件,第二个sed处理它们就位(如果你运行GNU sed,那就是)
答案 3 :(得分:0)
未经测试,但这应该做你想要的(在.csv之前提取数字并将该数字附加到.out文件中每一行的末尾)
awk 'FNR==1 { split(FILENAME, field, /[_.]/) }
{ print $0"\t"field[7] > FILENAME"_aaaa" }' *.out
for file in *_aaaa; do mv "$file" "${file/_aaaa}"; done
答案 4 :(得分:0)
而不是awk,你可能想要使用sed或coreutils。
从文件名中抓取数字,使用grep进行变换:
num=$(<<<filename grep -Eo '[^_]+\.csv' | cut -d. -f1)
<<<filename
相当于echo filename
。
使用GNU sed:
将num
附加到每一行
sed "s/\$/\t$num" filename
使用-i
开关就地修改filename
。
您还需要知道此方法的文件长度:
len=$(<filename wc -l)
将filename
和num
与粘贴:
paste filename <(seq $len | while read; do echo $num; done)
for filename in DWH_Export*; do
num=$(echo $filename | grep -Eo '[^_]+\.csv' | cut -d. -f1)
sed -i "s/\$/\t$num" $filename
done