使用awk追加到当前行的上方

  • 本文关键字:awk 追加 使用 bash awk
  • 更新时间 :
  • 英文 :


我有一个文本文件,其中第一个字段中的一些文本会滚动到下一行。

示例

Company Name LLC
Company Name2
LLC
Very Good company name but rolls
over

我可以获得滚动的行

awk '{ if (NF ==1) print $0}'

我正在寻找一种将文本附加到(NR -1)上的方法

正确输出

Company Name LLC
Company Name2 LLC
Very Good company name but rolls over
awk -v ORS= '
NR>1 { print( NF>1 ? "n" : OFS ) }
1;
END { print "n" }
' input_file
  • 取消设置ORS,这样打印就不会发出隐含的换行符
  • 在除第一行(即NR>1时)外的每一行上,打印适当的分隔符(换行在正常行之前,OFS在溢出之前)
  • 然后打印实际行(1是导致执行默认操作的最小"真"模式/操作。即print)
  • 最后,打印一行换行符

首先,您没有使用awk的模式操作语法和默认值;awk NF==1与您发布的命令具有相同的效果。

但对于你的Q,在awk中,你需要缓冲前一行,然后决定如何使用它:

awk 'NF==1{print p,$0; p=""; next} length(p){print p} {p=$0} END{print p}'

或者效率较低但更简单的

tac | awk 'NF==1{getline t; print t,$0; next} 1' | tac

使用您显示的示例和尝试,请尝试以下tac+awk代码。

tac Input_file | 
awk '
NF==1{
val=$0(val?OFS val:"")
next
}
NF>1{
print $0,val
val=""
}' | 
tac

我将使用GNUAWK执行此任务,方法如下:让file.txt内容为

Company Name LLC
Company Name2
LLC
Very Good company name but rolls
over

然后

awk 'BEGIN{RS=ORS=""}{print gensub(/n([^[:space:]]+)(n|$)/, " \1\2", "g")}' file.txt

给出输出

Company Name LLC
Company Name2 LLC
Very Good company name but rolls over

说明:我将RS设置为空字符串,因此GNUAWK将空行之间的内容视为行,在本例中,将整个内容视为单行。然后,我使用gensub函数来替换换行符之后的非空白字符,这些字符确实占用了整行。使用空格替换运行前的换行符。第一个捕获组用于所述非空白字符,第二个捕获组允许替换,因为这样的运行可能会被换行符或文件结尾终止,无论它是什么,都被用作替换值免责声明:此解决方案假定文件中从不存在空行。

(在gawk 4.2.1中测试)

$ awk 'NR>1{printf "%s%s", prev, (NF==1 ? OFS : ORS)} {prev=$0} END{print prev}' file
Company Name LLC
Company Name2 LLC
Very Good company name but rolls over
awk '
{NF>1 ? a[NR]=$0 : a[NR-1]=a[NR-1] FS $1}
END{for(i in a) print a[i]}
' file
Company Name LLC
Company Name2 LLC
Very Good company name but rolls over
  • NF>1如果有多个字段
    • true:a[NR]=$0向数组添加元素(行)
    • false:a[NR-1]=a[NR-1] FS $1更新前一个数组元素NR-1
  • for(i in a) print a[i]打印所有数组元素

从awk输出创建bash数组

$ readarray -t array < <(awk '{NF>1 ? a[NR]=$0 : a[NR-1]=a[NR-1] FS $1} END{for(i in a) print a[i]}' file)
$ declare -p array
declare -a array=([0]="Company Name LLC" [1]="Company Name2 LLC" [2]="Very Good company name but rolls over")

附加到bash数组

$ readarray -t -O "${#array[@]}" array < <(awk '{NF>1 ? a[NR]=$0 : a[NR-1]=a[NR-1] FS $1} END{for(i in a) print a[i]}' file2)
$ declare -p array
declare -a array=([0]="Company Name LLC" [1]="Company Name2 LLC" [2]="Very Good company name but rolls over" [3]="Company Name3 LLC" [4]="Company Name4 LLC" [5]="Very Good company2 name but rolls over")

@Jason Aruni

readarray -t -O "${#array[@]}" array < <(
printf "Company Name LLC nCompany Name2 nLLCnVery Good company name but rolls novern" | 
awk '{NF>1 ? a[NR]=$0 : a[NR-1]=a[NR-1] FS $1} END{for(i in a) print a[i]}'
)
for i in "${array[@]}"; do echo $i; done

输出

Company Name LLC
Company Name2 LLC
Very Good company name but rolls over

最新更新