我有一个带有约10,000行数据的大文本文件,因此每行可能有不同数量的列。例如:
789 KKPP 2018 08 09 10 20 30 AUTO A2987 10SM 5-MIN 22/13
790 KGOX 2018 08 09 10 20 35 AUTO P0002 21/19
...
798 KLXZ 2018 08 09 10 20 40 AUTO 18013GT 7SM 21/16 RMK A02 T02060156
799 KMNO 2018 08 09 10 20 45 AUTO 10SM P0001
...
...
Run Code Online (Sandbox Code Playgroud)
我想遍历每一行并提取出现前缀“ P00 *”的第二列。例如,在文件的以上代码段中,我想要:
KGOX P0002
KMNO P0001
Run Code Online (Sandbox Code Playgroud)
对应于线790和799。列数是完全随机的,并且可以从一行更改为另一行。最重要的是,在该行的某处,某些文本列以“ P00”开头。
我有一个简单的while读取循环:
while IFS='' read -r line || [[ -n "${line}" ]];
do
temp=$(echo ${line} | awk '{print …Run Code Online (Sandbox Code Playgroud) 我有以下代码:
awk '{h[$1]++}; END { for(k in h) print k, h[k]}' ${infile} >> ${outfile2}
Run Code Online (Sandbox Code Playgroud)
这实现了我想要的部分功能:打印出唯一值,然后还计算这些唯一值出现的次数。现在,我想从每个唯一值中打印出第二列和第三列。由于某种原因,以下似乎不起作用:
awk '{h[$1]++}; END { for(k in h) print k, $2, $3, h[k]}' ${infile} >> ${outfile2}
awk '{h[$1]++}; END { for(k in h) print k, h[$2], h[$3], h[k]}' ${infile} >> ${outfile2}
Run Code Online (Sandbox Code Playgroud)
第一个代码打印出最后一个索引的第二列和第三列,而第二个代码除了 k 和 h[k] 之外什么也不打印。
${infile} 看起来像:
20600 33.8318 -111.9286 -1 0.00 0
20600 33.8318 -111.9286 -1 0.00 0
30900 33.3979 -111.8140 -1 0.00 0
29400 33.9455 -113.5430 -1 0.00 0
30600 33.4461 -111.7876 -1 …Run Code Online (Sandbox Code Playgroud) 我有一个大型数组中包含多个5x5数组-总体形状为:5 x 5 x29。我想对每个5 x 5数组求和以生成一个单个数组,而不是29个单个数组。
我知道您可以按照以下方式进行操作:
new_data = data1[:,:,0] + data1[:,:,1] + ... + data1[:,:,29]
Run Code Online (Sandbox Code Playgroud)
但是,这对于大型阵列而言非常麻烦。有没有更简单的方法可以做到这一点?