我有一个包含 2 行信息的文本文档。第 1 行包含文件名,第 2 行包含参考 ID。该文档包含除所需信息之外的其他字符串,我正在尝试想出一种不混乱的方法来仅收集我想要的信息。多次使用“cut -d”似乎很草率。
以下是我的数据的一个例子
12:"content":"file;\r\n\tfilename=\"TestingFile.txt"}
13-"refid":"9B46BCAEDC9923"}]
利用这些信息,我想创建一个名为 TestingFile.txt 的文件并将 refid 值写入内容 - 基本上是“ ”之间的值,仅此而已。
文件名=\" 和重新定义”:” 总是会位于我想要抓取的数据之前,并且总会有一些字符位于最后一个“在线上。
答案1
awk -F'"' 'NR==1 {fname=$(NF-1);} NR==2{print $(NF-1) >fname;}' file
解释
awk
隐式循环遍历文件的每一行。每行分为多个字段。
-F'"'
这使得双引号字符充当字段分隔符。查看示例输入,这意味着我们想要的字段将是每行的倒数第二个
NR==1 {fname=$(NF-1);}
第一行是文件名。在 中
awk
,NF
是一行上的字段数。因此,$(NF-1)
引用倒数第二个字段。其内容保存到变量 中fname
。NR==2{print $(NF-1) >fname;}
第二行的倒数第二个字段是 ID。我们
print
将此 ID 添加到名为 的文件fname
。
例子
如果针对示例输入运行上述代码,则会TestingFile.txt
在当前目录中创建一个文件:
$ cat TestingFile.txt
9B46BCAEDC9923
更复杂的输入
假设输入文件如下:
12:"content":"file;\r\n\tfilename=\"TestingFile.txt","date":"2014-10-23"}
13-"refid":"9B46BCAEDC9923","author":"Anon"}]
由于我们的数据不再是倒数第二个字段,因此我们需要更改代码awk
:
awk -F'"' 'NR==1 {sub(/.*tfilename=\\"/, "");fname=$1;} NR==2 {sub(/.*refid":"/,"");print $1>fname;}' file2
此代码删除文件名(第 1 行)或 ID(第 2 行)之前的所有字符。完成此操作后,我们想要的信息将位于字段 1 中。其他代码相同。