我有一个文件夹,其中包含管道(|)分隔的数据。我想要文件夹中每个文件第一行的第 8 列列表以及文件名,如果所有这些数据都可以合并在一个文件中,那就太好了
答案1
为了传递文件,awk
我们可以使用 shell globstar。-F
可以用来定义字段分隔符,这-F'|'
就是我们所需要的。就只获得第一行而言,使用nextfile
就足够了。因此,我们可以这样做:
awk -F'|' '{print FILENAME,$8;nextfile}' ./*
从文件所在的文件夹中。
应该注意的是,nextfile
可能不支持。例如,正如 Stephane 所指出的,Debian 及其衍生版本附带了旧版本的mawk
,它没有nextfile
选项。如果您需要更多可移植的 awk 代码,则可以利用FNR
变量。例如:
awk -F'|' 'FNR==1{print FILENAME,$8}' ./*
答案2
虽然我还是更喜欢awk
方法(更清晰,更像 shell,更高效),这是使用 shell 循环效果相对较好的一种情况:
for file in *; do
IFS='|' read -r x x x x x x x text x < "$file" || continue
printf '%s\n' "$file: $text" || exit
done
答案3
find . ! -name . -prune -exec test -f {} \; -exec sh -c '
printf "%s:%s\n" "$1" "$(head -q -n 1 "$1" | cut -d\| -f8)"
' {} {} \;