我的目的是让代码尽可能简单。这里有 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 循环,请参阅阿彻玛的回答。