我想使用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行将进入第二个文件。
答案 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得到了这个想法,所以归功于他。