Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash awk解析文件名并将结果添加到每行的末尾_Bash_Awk - Fatal编程技术网

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