awk解析文件名并将结果添加到每行的末尾

时间:2012-11-01 11:03:26

标签: 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

我需要从文件名中获取.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

5 个答案:

答案 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

使用sed

使用GNU sed:

num附加到每一行
sed "s/\$/\t$num" filename

使用-i开关就地修改filename

使用粘贴

您还需要知道此方法的文件长度:

len=$(<filename wc -l)

filenamenum与粘贴:

结合使用
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