如何在循环的帮助下进行文件名排序

如何在循环的帮助下进行文件名排序

我的目的是让代码尽可能简单。这里有 5 个文件,即

A_1.CSV, A_2.CSV, A_3.CSV, A_4.CSV, A_5.CSV

以下代码检索 CSV 文件中的第一行。

代码:head.sh(文件名)

awk -F, 'NR==1 {print $0}' A_1.CSV > Header.csv
awk -F, 'NR==1 {print $0}' A_2.CSV >> Header.csv
awk -F, 'NR==1 {print $0}' A_3.CSV >> Header.csv
awk -F, 'NR==1 {print $0}' A_4.CSV >> Header.csv
awk -F, 'NR==1 {print $0}' A_5.CSV >> Header.csv

问题 :

在上面的代码中,仅文件名从A_1更改为A_2,依此类推。如何使用循环使代码变得简单。

例子 :

 for (i=1;i<=5;i++)
      {
       A_[i].CSV >> Header.csv
      }

我不知道如何用 shell 脚本来实现这个逻辑。

更新的代码:

目录中的文件:/home/thiyagu/Desktop/

for file in 'A_*.CSV'
do
awk -F, 'NR==1 {print $0}' $file >> Newheader.csv
done

答案1

关于什么

 awk 'FNR==1' A_*.csv > Header.csv

在哪里

  • FNR是文件编号记录
  • 默认操作是打印 while 行
  • 我放弃了,-F,因为你不关心单个字段(但是,如果你还有其他事情要做,你可以将其添加回来)

答案2

像这样的事情会起作用:

for file in `ls A_*.csv`
do
awk -F, 'NR==1 {print $0}' $file >> Header.csv
done

这是基本的 shell 脚本循环。如果您搜索,您可以在线找到这些教程。

答案3

单引号防止扩展:单引号字符串中的每个字符都按字面解释(除了'结束字符串的字符本身)。因此,当您想*充当通配符时,请将其放在引号之外。 (双引号也可以防止*充当通配符。)

for file in A_*.CSV …

更新后的代码的其余部分可能没问题,但你应该在变量替换周围加上双引号,不然迟早它会咬你。

您可以在循环之外进行重定向。这稍微快一点。

for file in A_*.CSV
do
  awk -F, 'NR==1 {print $0}' "$file"
done >> Newheader.csv

该片段附加到Newheader.csv.如果您想在文件已存在时覆盖该文件(就像在原始代码中一样),请替换>>>.

如果您只想打印多个文件的第一行,有多种方法可以简化您的脚本。由于您只是打印第一行,-F,因此未使用。此外,您可以使用head -n 1代替awk 'NR == 1 {print $0}'.在 Linux 上(但不是在所有 Unix 变体上),要仅打印几个文件的第一行,您可以使用head而不使用任何循环:

head -q -n 1 A_*.CSV >Newheader.csv

您也不需要 awk 循环,请参阅阿彻玛的回答

相关内容