Bash - 转置单个字段,保持其余字段相同并重复它

时间:2018-06-15 09:50:00

标签: bash

我有一个带管道分隔字段的文件。 例如

1,2,3|xyz|abc

我需要以下格式输出:

1|xyz|abc
2|xyz|abc
3|xyz|abc

我在bash中有一个工作代码:

while read i
do
    f1=`echo $i | cut -d'|' -f1`
    f2=`echo $i | cut -d'|' -f2-`
    echo $f1 | tr ',' '\n' | sed "s:$:|$f2:" >> output.txt
done < pipe_delimited_file.txt

任何人都可以建议使用循环实现此功能的方法。 该文件包含大量记录。

2 个答案:

答案 0 :(得分:4)

使用循环,但它在awk里面,所以非常快:

@objc func theDatePickerValueChanged(sender: UIDatePicker) {
    let formatter = DateFormatter()
    formatter.dateStyle = .medium
    formatter.timeStyle = .medium
    dateTimeTextfield.text = formatter.string(from: sender.date)
}

答案 1 :(得分:0)

Perl可能比awk快一点:

perl -F'[|]' -ane 'for $n (split /,/, $F[0]) {$F[0] = $n; print join "|", @F}' file
bash非常慢,但这是一种更快捷的使用方法。这使用普通bash而不调用任何外部程序:

(                                      # in a subshell:
    IFS=,                              # use comma as field separator
    set -f                             # turn off filename generation
    while IFS='|' read -r f1 rest; do  # temporarily using pipe as field separator,
                                       #   read  first field  and  rest of line
        for word in $f1; do            # iterate over comma-separated words
            echo "$word|$rest"
        done
    done
) < file