2

我有许多具有相似名称的文件,例如

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
4

5 回答 5

2
for file in *
do
   sfx=$(echo "$file" | sed 's/.*_\(.*\).csv.*/\1/')
   sed -i "s/$/\t$sfx/" "$file"
done
于 2012-11-01T14:36:52.073 回答
1

未经测试,但这应该可以满足您的要求(提取 .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 
于 2012-11-01T12:46:13.147 回答
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

或者

sed 's/.*_\(.*\).csv.*/&\t\1/' file*

要使此更改保存在同一个文件中(如果您有 GNU sed):

sed -i 's/.*\(.\).csv.*/&\t\1/' file
于 2012-11-01T11:08:00.697 回答
0

您可能想要使用 sed 或 coreutils 而不是 awk。

从文件名中获取数字,使用 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
于 2012-11-01T12:46:36.997 回答
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,即) .

于 2012-11-01T11:47:30.103 回答