如何使用 AWK 打印此内容?
我有一个如下所示的文件:
1 543423 34354
2 5654656 3423 xyz_1378,xyz_1379
3 4645656 34234354 xyz_1384,xyz_1385
4 5654 78678 xyz_1390,xyz_1391,xyz_1392
5 54654 76867 xyz_1411,xyz_1412,xyz_1413
6 54654 8678
7 56546 67867 xyz_1711
8 678 7867
9 76867 7876 xyz_2940
10 6786 678678 xyz_3101,xyz_3102,xyz_3103,xyz_3104,xyz_3105,xyz_3106,xyz_3107
11 67867 78678
请注意,它包含 4 个字段,以空格分隔。最后一个(第四个)字段可能为空,并且可能包含多个用逗号分隔的值。
我想打印最后一行的所有值,每行一个。我该如何做到这一点(最好使用 awk)?
更新: 我需要对许多文件批量执行此操作(将所有文件的串联输出放在一起)。
这有效:
for x in *; do awk '{print $4}' $x/filename | awk --field-separator="," '{if ($0 != "") {for (i=1; i<NF+1; i++) print $i}}'; done;
并返回类似的东西
xyz_1378
xyz_1221
xyz_97
xyz_132523
xyz_242
我现在唯一缺少的是,我希望上面的每一行都以一个额外的字段开始 - $x (来自 for
循环的字段)。
我尝试将 print $i
更改为 print $x,$i" 但
x` 在此范围内似乎无法正确识别。有什么想法吗?
谢谢!
I have a file that look like this:
1 543423 34354
2 5654656 3423 xyz_1378,xyz_1379
3 4645656 34234354 xyz_1384,xyz_1385
4 5654 78678 xyz_1390,xyz_1391,xyz_1392
5 54654 76867 xyz_1411,xyz_1412,xyz_1413
6 54654 8678
7 56546 67867 xyz_1711
8 678 7867
9 76867 7876 xyz_2940
10 6786 678678 xyz_3101,xyz_3102,xyz_3103,xyz_3104,xyz_3105,xyz_3106,xyz_3107
11 67867 78678
Note it contains 4 fields, space separated. the last (fourth) field might be empty, and may contain numerous values separated by commas.
I would like to print all the values from the last row, one per line. how can I do that (preferably using awk)?
UPDATE:
I need to do this in batch for many files (gets the concatenated output of all the files together).
This works:
for x in *; do awk '{print $4}' $x/filename | awk --field-separator="," '{if ($0 != "") {for (i=1; i<NF+1; i++) print $i}}'; done;
and returns something like
xyz_1378
xyz_1221
xyz_97
xyz_132523
xyz_242
The only thing I am missing now, is that I want each of the above line to begin with an extra field - $x (the one from the for
loop).
I tried changing print $i
to print $x,$i" but
x` does not seem to be recognized correctly in this scope. Any ideas?
Thanks!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
使用 awk 的 -v 选项将变量传递到 awk 脚本中,而不是依赖 shell 的替换。另外,您只需要调用一次 awk
,或者,如果您不介意看到“dir/filename”:
如果您有大量目录,则在扩展“*/filename”时您的 shell 可能会阻塞,因此请使用 find 和 xargs:
(需要 GNU find/xargs 作为 -print0/-0 选项)
Use awk's -v option to pass the variable into the awk script instead of relying on the shell's substitution. Also, you only need one call to awk
or, if you don't mind seeing "dir/filename":
If you have huge numbers of directories, your shell may choke when expanding "*/filename", so use find and xargs:
(requires GNU find/xargs for the -print0/-0 options)
也许您可以将命令中的其中一个语句更改为
,然后处理其输出。
FILENAME
是内部 awk 变量,用于获取正在处理的文件的文件名。Probably you can change one of the statements in your command to
and then work on the output of this.
FILENAME
is the internal awk variable for getting the filename of the file on which it is processing.使用
NF>=4
作为条件来查看字段中是否有任何内容。然后split($4,a,/,/)
将为您提供一个包含所有值的数组a
。将其放入一个大型结果数组中:并在最后打印它:
如果您希望对其进行排序,请通过
sort(1)
管道过滤输出Use
NF>=4
as condition to see if there is anything in the field. Thensplit($4,a,/,/)
will give you an arraya
with all values. Put that into a large result array:and print it at the end:
If you want that sorted, filter the output by piping through
sort(1)