连接目录中所有文件的第n列的有效方法?

问题描述 投票:0回答:1
for 循环太慢了。文件有 500k 行。我想专门加入所有文件的第四列。在右侧逐列追加。

每个文件中的列由制表符分隔。

col1 col2 col3 col4 col5 a 0 0 -1 0.001 b 1 0 2 0.004 c 2 0 3 0 col1 col2 col3 col4 col5 c 2 0 -9 0.004 s 1 0 5 0.002 d 3 0 3 0.4 col1 col2 col3 col4 col5 r 2 1 0 0.4 j 1 1 1 0.2 r 3 1 2 0.1
我想要:

file1 file2 file3 -1 -9 0 2 5 1 3 3 2
我首先尝试转换为.csv:

for file in $(ls) do awk '{$1=$1}1' OFS=',' ${file} > ${file}.csv done


然后这样做:

eval paste -d, $(printf "<(cut -d, -f4 %s) " *.csv)


但我收到此错误:

paste: /dev/fd/19: Too many open files


我必须加入 400 个文件,每个文件有 500k 行。

bash awk paste cut
1个回答
0
投票
您的操作系统不允许您一次

paste

那么多文件。你必须把它们分成更小的批次。以下是一次简单地做一个的方法。

for file in *.csv; do if [ -e tempfile ]; then paste tempfile <(cut -d, -f4 "$file") >tempfile2 mv tempfile2 tempfile else cut -d, -f4 "$file" >tempfile fi done mv tempfile result.csv
顺便说一句,

不要在脚本中使用ls

你想要的只是

awk '{$1=$1}1' OFS=',' * > ${file}.csv
    
© www.soinside.com 2019 - 2024. All rights reserved.