我有一个文本文件,其中第一个字段中的一些文本会滚动到下一行。
示例
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
- true:
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