Bash 让awk在for循环中正常工作

Bash 让awk在for循环中正常工作,bash,Bash,我试图从22个不同的文件中提取第二列。在处理单个文件时,我会得到正确的输出,但在循环中,每个文件都会在一个文件中串联多个不同文件的2列。谁能帮帮我吗 for i in f* do awk '{print $2}' f* > a_$i done 改变你的命令,比如 for i in f* do awk '{print $2}' "$i" > "a_$i" done 一艘班轮 for i in f*; do awk '{print $2}' "$i" >

我试图从22个不同的文件中提取第二列。在处理单个文件时,我会得到正确的输出,但在循环中,每个文件都会在一个文件中串联多个不同文件的2列。谁能帮帮我吗

for i in f*
do
    awk '{print $2}' f* > a_$i
done    

改变你的命令,比如

for i in f*
do
    awk '{print $2}' "$i" > "a_$i"
done
一艘班轮

for i in f*; do awk '{print $2}' "$i" > "a_$i"; done

您需要将awk命令中的
f*
替换为存储当前文件名的
$i

这就是您想要的:

awk '{print $2 >"a_"FILENAME}' f*
对于每个以字母
f
开头的文件,这会将其第二列写入一个以
a\u
开头的新文件

输出文件的行数与输入文件的行数相同,但输出文件只有第二列

请注意,上述操作之所以有效,是因为
awk
中的含义与在shell中有所不同

例子 假设我们有一系列文件,如:

$ cat f1
One 1
One 11
现在,让我们运行
awk
命令:

$ awk '{print $2 >"a_"FILENAME}' f*
完成此操作后,目录中有一系列
a.*
文件,例如:

$ cat a_f1
1
11

在循环的每次迭代中,
awk
命令行上的
f*
glob让
awk
对每个文件进行操作,而不是将每个文件的每个提取列的输出放在不同的文件中;支持
FILENAME
和将
>name
print
一起使用。@chepner感谢您提供的信息:答案更新以删除对GNU的提及。非常感谢,但是您的方法只对第一个文件有效,而对后续文件无效,并且在我将其放入for时也没有太大的不同loop@sknimo好奇。对我来说,它不仅适用于第一个文件,而且适用于所有文件。你在用什么操作系统?什么版本的
awk
?@John1024,我使用的是Ubuntu 14.10,但我是linux新手,所以故障也可能来自我这边。我不知道如何检查我正在使用的awk版本,但因为我不久前安装了它,我想相信它是最新版本。我现在发现自己在一个处理大数据的领域,你能推荐一本书来帮助我在shell脚本方面有一个良好的开端吗?