給定一個字串陣列,我希望 IFS 通過下劃線決議每個字串,使用相同的分隔符將前三個分隔值連接在一起并將它們輸出到一個空串列。例如,如果我有陣列input=("L2Control_S3_L001_R1_001.fastq", "L2Control_S3_L001_R2_001.fastq")IFS 將采用第一個字串并用下劃線將其分隔,因此輸出將是:
L2Control
S3
L001
R1
001.fastq
之后,它將采用前三個分隔值并用下劃線將它們連接在一起:"L2Control_S3_L001"。最后,這個值將被附加到一個新的陣列上,output=("L2Control_S3_L001")這個程序將一直持續到陣列中的所有值都完成為止。我已經嘗試了下面的實作,但它似乎可以無限運行。
#!/bin/bash
str=("L2Control_S3_L001_R1_001.fastq", "L2Control_S3_L001_R1_001.fastq")
IFS='_'
final=()
for (( c = 0; c = 2; c )); do
read -ra SEPA <<< "${str[$c]}"
final =("${SEPA[0]}_${SEPA[1]}_${SEPA[2]}")
done
有人可以幫我解決這個問題嗎?
uj5u.com熱心網友回復:
${array[*]}擴展使用 IFS的第一個字符連接元素。您可以將其與${var:offset:length}擴展相結合。
output=()
for str in "${input[@]}"; do
read -ra fields <<< "$str"
output =("${fields[*]:0:3}")
done
我發現declare -p varname ...檢查變數的內容很方便。
這也可以通過 bash 引數擴展來完成:
str="L2Control_S3_L001_R1_001.fastq"
IFS=_
suffix=${str#*"$IFS"*"$IFS"*"$IFS"}
first3=${str%"$IFS$suffix"}
declare -p str suffix first3
declare -- str="L2Control_S3_L001_R1_001.fastq"
declare -- suffix="R1_001.fastq"
declare -- first3="L2Control_S3_L001"
也可以在一行中做到這一點,但這很麻煩:
first3="${str%"$IFS${str#*"$IFS"*"$IFS"*"$IFS"}"}"
uj5u.com熱心網友回復:
設定(注意不需要逗號來分隔陣列條目):
str=("L2Control_S3_L001_R1_001.fastq" "L2Control_S3_L001_R1_001.fastq")
一個想法是使用while/read回圈根據分隔符 ( IFS=_) 將輸入字串決議為 4 個部分:
final=()
while IFS=_ read -r f1 f2 f3 ignore
do
final =("${f1}_${f2}_${f3}")
done < <(printf "%s\n" "${str[@]}")
typeset -p final
變數ignore將分配到欄位#4-#n 的位置。
這會產生:
declare -a final=([0]="L2Control_S3_L001" [1]="L2Control_S3_L001")
uj5u.com熱心網友回復:
這是對前 3 個元素用 . 分隔的冗長描述_。
printf "%s\n" "${str[@]}" | cut -d_ -f-3
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/455991.html
