【问题标题】:Bash split large file into smaller filesBash 将大文件拆分成小文件
【发布时间】:2013-04-05 11:56:14
【问题描述】:

所以我想根据第 8 列将一个相当大的文件分成几个小文件。所以我写了这个脚本:

#!/bin/bash
run_command(){
eval ${1}
wait
}
chInput=("1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12" "13" "14" "15" "16" "17" "18" "19" "Z" "T" "G" "F" "A" "D" "P")
sampInput=("heyA")

for ((x=0;x<${#chInput[@]};x++));do
com="awk -F'\t' '$8=="${chInput[x]}"' /home/location/"$sampInput"_This_P.txt > "$sampInput"Ch"${chInput[x]}".txt"
run_command "${com}"
done

但它不起作用,因为

'$8=="

awk: ==1
awk: ^ syntax error
awk: ==2
awk: ^ syntax error
awk: ==3
awk: ^ syntax error
awk: ==4
awk: ^ syntax error

但只是在做

awk -F'\t' '$8==1' /home/location/heyA_This_P.txt > Ch1.txt

从命令行确实有效

我可以做些什么来解决这个问题?

【问题讨论】:

    标签: linux bash file shell


    【解决方案1】:

    严重的问题是双引号;在您分配变量时,$8 将被某些东西(可能根本没有)替换。您可以尝试使用带有适当转义的单引号,但真正的解决方案可能是深呼吸并重新开始,而无需在变量中包含 eval 或 Awk 脚本。

    这个椒盐卷饼逻辑的目的是什么?您可能应该阅读并牢记http://mywiki.wooledge.org/BashFAQ/050中的建议

    以下是解决问题的快速尝试:

    #!/bin/bash
    
    chInput=("1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12" "13" "14" "15" "16" "17" "18" "19" "Z" "T" "G" "F" "A" "D" "P")
    sampInput=("heyA")
    
    for ((x=0;x<${#chInput[@]};x++));do
        awk -F'\t' '$8=="'"${chInput[x]}"'"' /home/location/"$sampInput"_This_P.txt > "$sampInput"Ch"${chInput[x]}".txt
    done
    

    特别注意将"${chInput[X]}" 插入到脚本中的构造(实际上,除了删除变量和eval 内容之外,这实际上是我唯一更改的内容)。那是单引号中的字符串,与双引号中的字符串相邻,与单引号中的字符串相邻,在 Bash 中计算为单个字符串。所以'foo'"bar"'baz' 的计算结果为foobarbaz,类似地,与"'bar'" 相邻的'"foo"' 的计算结果为"foo"'bar'。这里,'$8=="' 与 "${chInput[x]}" 相邻,与 '"' 相邻计算为 $8=="...",其中双引号中的内容在赋值时被替换。

    (你也不需要数组;你可以这样做

    for c in "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12" \
             "13" "14" "15" "16" "17" "18" "19" "Z" "T" "G" "F" \
             "A" "D" "P"
    do
        awk -F'\t' '$8=="'"$c"'"' /home/location/"$sampInput"_This_P.txt > "${sampInput}Ch$c.txt"
    done
    

    并与 Classic Bourne shell 兼容。)

    【讨论】:

    • 我尝试这样做的原因是因为我正在比较这个文件和另一个文件,并且程序因为它的大小而挂断了这个文件。我想试试看我是否可以采取懒惰的方式并拆分文件而不是重写一些代码。我读了一些文章说它会起作用,一些说它不会,我想亲眼看看
    猜你喜欢
    • 2017-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-01
    • 2018-07-23
    • 2018-09-30
    • 1970-01-01
    相关资源
    最近更新 更多