包括文件内容的路径
Including path to the content of a file
我有一个名为 alldatalist.txt
的文件,其中包含:
../19970327/datalist.txt
../19970328/datalist.txt
../19970329/datalist.txt
../19970330/datalist.txt
../19970331/datalist.txt
../19970401/datalist.txt
../19970402/datalist.txt
../19970403/datalist.txt
../19970404/datalist.txt
../19970405/datalist.txt
每个文件(或 alldatalist.txt
中的行)都有自己的内容(例如第一个 file/row):
$ cat ../19970327/datalist.txt
19970327_0100.xyz
19970327_0200.xyz
19970327_0300.xyz
19970327_0400.xyz
19970327_0500.xyz
我一直在挠头试图用 alldatalist.txt
文件中的“外部”路径打印后者,所以得到这个:
../19970327/19970327_0100.xyz
../19970327/19970327_0200.xyz
../19970327/19970327_0300.xyz
../19970327/19970327_0400.xyz
../19970327/19970327_0500.xyz
cat alldatalist.txt | xargs cat
生成没有所需路径的每个文件(或 alldatalist.txt
中的行)的内容,因此我可能会包含 paste
+ cut
(或 basename
) 工具使用 for 循环添加每个路径,但它似乎是一个过于复杂的解决方案。我想知道你是否可以建议我一个技巧,以更清晰 and/or 更简单的方式添加该路径。
感谢任何支持。
您可以将基本目录名称添加到文件中每一行的开头并打印内容(确保目录名称不与 sed 冲突,如果冲突,您可以使用 r
sed 命令从包含目录名的文件中安全读取):
while read -r line; do
dir="$(dirname "$line")/"
sed "s|^|$dir|" < "$line"
done < alldatalist.txt
您可以使用 shell 循环和 sed
:
轻松完成此操作
while IFS= read -r filename; do
b=${filename%/*}
sed "s%^%$b/%" "$filename"
done < alldatalist.txt
或与 xargs
和 Awk 类似:
xargs < alldatalist.txt awk '
FNR==1 { b = FILENAME; sub(/[^\/]*$/, "", b) }
{ print b [=11=] }'
在 shell 循环中,shell parameter expansion ${variable%pattern}
产生 variable
的值,并删除了 pattern
上的任何匹配项结束。同样有一个 ${variable#pattern}
前缀替换;详见手册
因为替换字符串包含文字斜杠,所以我们使用 %
作为 sed
中的模式分隔符;另见 Using different delimiters in sed commands and range addresses
在 Awk 脚本中,我们使用 xargs
从文件中输入 awk
尽可能多的文件名,以适应其命令行,并且 运行 所有的 Awk 脚本那些。 FNR
变量包含当前文件中的行(或更一般的记录)编号;所以在每个文件的第一行,我们重新计算 b
的值,然后将其作为前缀打印在所有输出行上。
我有一个名为 alldatalist.txt
的文件,其中包含:
../19970327/datalist.txt
../19970328/datalist.txt
../19970329/datalist.txt
../19970330/datalist.txt
../19970331/datalist.txt
../19970401/datalist.txt
../19970402/datalist.txt
../19970403/datalist.txt
../19970404/datalist.txt
../19970405/datalist.txt
每个文件(或 alldatalist.txt
中的行)都有自己的内容(例如第一个 file/row):
$ cat ../19970327/datalist.txt
19970327_0100.xyz
19970327_0200.xyz
19970327_0300.xyz
19970327_0400.xyz
19970327_0500.xyz
我一直在挠头试图用 alldatalist.txt
文件中的“外部”路径打印后者,所以得到这个:
../19970327/19970327_0100.xyz
../19970327/19970327_0200.xyz
../19970327/19970327_0300.xyz
../19970327/19970327_0400.xyz
../19970327/19970327_0500.xyz
cat alldatalist.txt | xargs cat
生成没有所需路径的每个文件(或 alldatalist.txt
中的行)的内容,因此我可能会包含 paste
+ cut
(或 basename
) 工具使用 for 循环添加每个路径,但它似乎是一个过于复杂的解决方案。我想知道你是否可以建议我一个技巧,以更清晰 and/or 更简单的方式添加该路径。
感谢任何支持。
您可以将基本目录名称添加到文件中每一行的开头并打印内容(确保目录名称不与 sed 冲突,如果冲突,您可以使用 r
sed 命令从包含目录名的文件中安全读取):
while read -r line; do
dir="$(dirname "$line")/"
sed "s|^|$dir|" < "$line"
done < alldatalist.txt
您可以使用 shell 循环和 sed
:
while IFS= read -r filename; do
b=${filename%/*}
sed "s%^%$b/%" "$filename"
done < alldatalist.txt
或与 xargs
和 Awk 类似:
xargs < alldatalist.txt awk '
FNR==1 { b = FILENAME; sub(/[^\/]*$/, "", b) }
{ print b [=11=] }'
在 shell 循环中,shell parameter expansion ${variable%pattern}
产生 variable
的值,并删除了 pattern
上的任何匹配项结束。同样有一个 ${variable#pattern}
前缀替换;详见手册
因为替换字符串包含文字斜杠,所以我们使用 %
作为 sed
中的模式分隔符;另见 Using different delimiters in sed commands and range addresses
在 Awk 脚本中,我们使用 xargs
从文件中输入 awk
尽可能多的文件名,以适应其命令行,并且 运行 所有的 Awk 脚本那些。 FNR
变量包含当前文件中的行(或更一般的记录)编号;所以在每个文件的第一行,我们重新计算 b
的值,然后将其作为前缀打印在所有输出行上。