我有一个文本文件集合,包含比我需要的更多的数据。每个文件的第一行包含一个逗号分隔的字符串,如下所示:
stop_id,stop_code,stop_name,stop_desc,stop_lat,stop_lon,location_type,parent_station,zone_id
然后,在这些键下面是所有的数据。我需要将该数据的一个子集提取到一个新的文本文件中,这样我就可以使用该子集(我不需要所有的数据,它太多了)。
我使用这个命令提取第一行:
sed -n '1p' source.txt > destination.txt
我还使用这个命令提取我需要的特定行:
grep "string" source.txt > destination.txt
挑战在于,当我在同一个脚本中运行这两个命令时(基本上是用一行或&&
分隔),grep
输出将覆盖sed
输出。如何按顺序运行这两种方式,并使两者的组合输出?
我注意到一个类似的问题,它涉及使用一个更复杂的grep
命令来定位一行,然后是一系列行。这在这里行不通,因为我需要从每个文件中提取数据的第一行是不同的。
理想情况下,我想编写一个函数,可以针对我需要处理的每个文件运行该函数,但我需要链接这些命令并首先组合它们的输出。
发布于 2017-12-29 08:24:58
只需将grep
输出更改为附加,
grep "string" source.txt >> destination.txt
发布于 2017-12-29 08:26:53
sed
可以同时执行两项工作(打印第一行和包含string
的所有行):
sed -n '1p; /string/p' source.txt > destination.txt
或者更长的版本:
sed -n -e '1p' -e '/string/p' source.txt > destination.txt
发布于 2017-12-29 08:48:13
有很多种方法可以做到这一点。您可以使用一个命令获得这两行,如@塞勒斯sed
解决方案。下面是几个其他工具可以做到这一点:
awk 'NR==1 || /string/' source.txt > destination.txt
perl -ne 'print if /string/ || $. ==1' source.txt > destination.txt
当然,您也可以运行正在运行的两个命令,只需将第二个命令更改为附加到文件如BANJOSA所建议。或者,您可以将两个命令分组在一个子subshel中,并将子subshell的输出重定向到一个文件中:
(sed -n '1p' file; grep string file) source.txt > destination.txt
或
{ sed -n '1p' file; grep string file; } source.txt > destination.txt
因此,如果您要做的是利用这些函数,只需将其添加到shell的初始化文件(例如~/.bashrc
):
foo(){ sed -n '1p' file; grep string file; }
现在您可以运行函数foo
来执行您想做的事情:
foo source.txt > destination.txt
https://unix.stackexchange.com/questions/413614
复制相似问题