Bash 让awk在for循环中正常工作
我试图从22个不同的文件中提取第二列。在处理单个文件时,我会得到正确的输出,但在循环中,每个文件都会在一个文件中串联多个不同文件的2列。谁能帮帮我吗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" >
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脚本方面有一个良好的开端吗?