在文件中创建剪切列

时间:2014-08-07 14:24:52

标签: bash sh

我想使用bash在文件中添加一些行 这里我的文件是怎样的

   589097      1234567802 32 0 0    25 4 4935232014070914070958     0                                             2              0                     0     0    0.00000000000341392324000000000341395276
   589097      1234567802 32 0 0    25 4 4935232014070914070958     0                                             2              0                     0     0    0.00000000000341392324000000000341395276
   589097  12345678901001 32 0 0    10 4 4935232014070914070958     0                                            10              0                     0     0    0.00000000000341392324000000000341395276
   547233  12345678901001 34 0 0    10 4 4935232014070914070958     0                                            10              0                     0     0    0.00000000000001074106000000000003392014
   358474  12345678901001 32 0 0     5 4 4935232014070914070958     0                                            10              0                     0     0    0.00000000000204811406000000000204817557
   547233        44556601 34 0 0    2023 4935232014071314071358     0                                             3              0                     0     0    0.00000000000001074106000000000003392014
   547233        44556602 34 0 0    2023 4935232014071314071358     0                                             3              0                     0     0    0.00000000000001074106000000000003392014
   547233        44556603 34 0 0    2023 4935232014071314071358     0                                             3              0                     0     0    0.00000000000001074106000000000003392014
   547233        44556604 34 0 0    2023 4935232014071314071358     0                                             3              0                     0     0    0.00000000000001074106000000000003392014
   547233        44556605 34 0 0    2023 4935232014071314071358     0                                             3              0                     0     0    0.00000000000001074106000000000003392014
   547233        44556606 34 0 0    2023 4935232014071314071358     0                                             3              0                     0     0    0.00000000000001074106000000000003392014
   547233        44556607 34 0 0    2023 4935232014071314071358     0                                             3              0                     0     0    0.00000000000001074106000000000003392014
   547233        44556608 34 0 0    2023 4935232014071314071358     0                                             3              0                     0     0    0.00000000000001074106000000000003392014
   547233        44556609 34 0 0    2023 4935232014071314071358     0                                             3              0                     0     0    0.00000000000001074106000000000003392014
   547233        44556610 34 0 0    2023 4935232014071314071358     0                                             3              0                     0     0    0.00000000000001074106000000000003392014
   626967      1234567803 32 0 0    22 4 4935232014071214071258     0                                             6              0                     0     0    0.00000000000374291378000000000374291403
   123456      1234567804 99 0 0    20 4 4935202014071414071458     0                                             6              0                     0     0    0.00000000000123456789000000000987654321
   698218  12345678901002 44 0 0     8 4 4935202014071414071458     0                                            16              0                     0     0    0.00000000000374291378000000000374291403
   370958  12345678901002 32 0 0    10 4 4935202014071414071458     0                                            16              0                     0     0    0.00000000000404240990000000000404244066
   123456  12345678901002 10 0 0     2 4 4935202014071414071458     0                                            16              0                     0     0    0.00000000000123456780000000000123456780
   528034      1234567805 30 0 0    20 4 4935232014071514071558     0                                             4              0                     0     0    0.00000000000378397276000000000378404939
   686200  12345678901003 36 0 0     1 8 4935232014071514071558     0                                             2              0                     0     0    0.00000000000365718954000000000365727049
   368530  12345678901004 34 0 0    10 4 4935232014071614071658     0                                            13              0                     0     0    0.00000000000274290046000000000274294645
   368530  12345678901004 36 0 0    10 4 4935232014071614071658     0                                            13              0                     0     0    0.00000000000274290046000000000274294647
   854809  12345678901005 32 0 0    10 4 4935232014071614071658     0                                            13              0                     0     0    0.00000000000202369548000000000202378103
   854809  12345678901005 34 0 0    10 4 4935232014071614071658     0                                            13              0                     0     0    0.00000000000202369548000000000202378105
   368530      1234567806 38 0 0    22 4 4935232014071614071658     0                                             7              0                     0     0    0.00000000000274290046000000000274294649
   368530      1234567807 40 0 0    22 4 4935232014071614071658     0                                             7              0                     0     0    0.00000000000274290046000000000274294651
   854809      1234567808 36 0 0    22 4 4935232014071614071658     0                                             7              0                     0     0    0.00000000000202369548000000000202378107
   854809      1234567809 38 0 0    22 4 4935232014071614071658     0                                             7              0                     0     0    0.0000000000020236954800000000020237810

我有一些规则: 第二栏是My NumCarton。我将不得不用这个数字剪切我的文件。 这是我的代码:

#!/bin/bash
# function which extract either Carton Number
split()
{
    echo "$1" |cut -f$2 -d/
}

# Delete previous file
rm -f ?

# Processing Data
fich=1
nb_lig=0
#for info in "${data[@]}"
cat inputter.txt| while read info
do
    # If the Carton Number has change
    carton=$(split "$info" 2)
    if test "$carton" != "$same_carton"
    then
            # We have a new carton Number
            same_carton="$carton"


            # If we have previous lines in the buffer we wrote down in the file
            if test "${#buffer[*]}" -gt 0
            then
                    for lig in "${buffer[@]}"
                    do
                            echo "$lig"
                    done >>"$fich"
            fi

            # we retain lines from the buffer
            nb_lig=$(expr $nb_lig + ${#buffer[*]})

            # we initiate the buffer()
            buffer=()
    fi

    # we add lines to the buffer table
    buffer[${#buffer[*]}]="$(split "$info" 1) $carton"

    # if the data is beyond 4 lines
    if test $(expr ${#buffer[*]} + $nb_lig) -gt 4
    then
            # we have a new file
            fich=$(expr $fich + 1)
            nb_lig=0
    fi

完成

假设我的文件在inputter.txt中。 我的问题在于拆分功能。 有了这个功能,我想得到NumCarton所以我要比较下一行的下一个。

但是我的一些NumCarton长14位,其他没有。

也许一个例子可能会有所帮助。见第1行和第2行可能在同一个文件中。我们可以添加2行,但这会削减一个包。 NumCarton' 12345678901001'有3件。所以我们创建了另一个文件。这个新文件应该包含那3个项目+包含' 44556601'的行。总结一个文件可以包含一个或多个包。但是一个文件不能包含4行以上

这是我文件的一小部分:

589097      1234567802 32 0 0    25 4 4935232014070914070958     0                                             2              0                     0     0    0.00000000000341392324000000000341395276
589097      1234567802 32 0 0    25 4 4935232014070914070958     0                                             2              0                     0     0    0.00000000000341392324000000000341395276
589097  12345678901001 32 0 0    10 4 4935232014070914070958     0                                            10              0                     0     0    0.00000000000341392324000000000341395276
547233  12345678901001 34 0 0    10 4 4935232014070914070958     0                                            10              0                     0     0    0.00000000000001074106000000000003392014
358474  12345678901001 32 0 0     5 4 4935232014070914070958     0                                            10              0                     0     0    0.00000000000204811406000000000204817557

根据我上面说的, 这两行将放在第一个文件中 3行+ 1行将进入第二个文件。

2 个答案:

答案 0 :(得分:0)

read为您完成工作:

cat inputter.txt| while read junk carton junk junk junk junk junk junk junk

无论字符有多少,这都会将第二列读入变量carton。另一个变量junk只是作为占位符重用。

根据需要调整代码的剩余部分。

答案 1 :(得分:0)

我相信这可以做你想要的。您可以放弃split函数并使用内置的{b}内置的{b}来提取前两列。我还更新了一些代码,以利用bash中的一些功能。我已经在bash版本3.2.25上对此进行了测试,它似乎可以做你想要的:

read

#!/bin/bash print_buffer() { name=$1[@] buffer=("${!name}") for lig in "${buffer[@]}"; do echo "$lig" done >> "$2" } # Delete previous file rm -f ? # Processing Data fich=1 nb_lig=0 while read num_art carton rest do if [[ "$carton" != "$same_carton" ]] then same_carton="$carton" print_buffer buffer "$fich" (( nb_lig += ${#buffer[*]} )) buffer=() fi buffer[${#buffer[*]}]="$num_art $carton $rest" if (( ${#buffer[*]} + nb_lig > 4 )) then (( ++fich )) nb_lig=0 fi done < inputter.txt print_buffer buffer "$fich" 一次处理一行输入,将行拆分为&#34;单词&#34;并将每个单词分配给作为参数提供的名称列表。默认行为是在空格和制表符上分割行,因此您的第一列输入将写入read,第二列将写入num_art。由于没有提供足够的名称,因此该行的其余部分将写入carton

我没有使用rest,而是在循环结束时使用了cat inputter.txt |,这样做无需使用单独的命令。

您需要确保将数组中的所有剩余项目打印到最后一个文件。我已经将循环转换为执行此操作的函数,以避免重复代码。

顺便说一下,数组是通过引用函数< inputter.txt传递的。我从this answer by choroba得到了这个想法,所以归功于他。